Страницы

Поиск по вопросам

суббота, 13 октября 2018 г.

Пробрасывание исключений

Скажите, пожалуйста, пробрасывание исключений на верх это нормальная практика?
Просто сейчас в проекте своем учебном попробовал это сделать (точнее сделал это во все узких места, особенно там, где идет работа с БД), и мне показалось это удобным в плане поиска ошибок и отладке.
Пример (на логику не обращайте внимания, интересует только проброс исключений):
// Получение какого-либо значения из базы данных в виде object private object GetData_AsObject() { try { //тут идет получение данных из бд } catch (Exception e) { throw new Exception("Получение данных из " + tableName + "." + column); } }
// Получение какого-либо значения из базы данных в виде string public string GetData_AsString() { try { if (GetData_AsObject() != null) return GetData_AsObject().ToString(); else return ""; } catch (Exception e) { throw new Exception(e.Message + " as string"); } }
// Получение какого-либо значения из базы данных в виде int public int GetData_AsInt() { try { if (GetData_AsObject() != null) return int.Parse(GetData_AsObject().ToString()); else return 0; } catch (Exception e) { throw new Exception(e.Message + " as int"); } }
И так исключение поднимается выше. Если где-то выше в коде есть обработка исключения, то она выполняется и не беспокоит пользователя. Если обработки нет, то пользователь получает полное сообщение об ошибке.
Но в коде получается очень много конструкций try-catch. Не считается ли это захламлением?


Ответ

Да, это вполне нормальная практика. Чаще всего код не должен заниматься обработкой исключений - у него обычно на это нет соответствующих полномочий. Иными словами, это не его дело. Он должен либо выполнить некие действия, либо, получив исключение, пробросить его вызывающему коду, которому можно доверить эту самую обработку (что само по себе является отдельной задачей, а согласно Single responsibility, первому из принципов SOLID, объект не должен брать на себя более одной обязанности) Бывают, конечно, ситуации, когда исключение является одним из видов "штатной ситуации", и сгенерировавший его код способен корректно его обработать, но это довольно нечастые случаи (и честно говоря, примеры таких ситуаций у меня в голове как-то сразу не всплывают). Более того, тут возникает вопрос - стоит ли в такую ситуацию рассматривать как исключение.
Если говорить о вашем примере, то в любом случае логика реакции на исключение должна находиться вне сферы ответственности кода, работающего с БД . Вряд ли этот код должен брать на себя еще и задачу записи в лог или формирования человекопонятного сообщения об ошибке для конечного пользователя.
З.Ы. несмотря на ваши слова про "на логику не обращайте внимания", я всё не удержусь и добавлю: искренне надеюсь, следующий кусок не из реального кода?
if (GetData_AsObject() != null) return GetData_AsObject().ToString(); else return "";
З.Ы. вы же вроде задавали несколько месяцев тому назад очень похожий вопрос

Комментариев нет:

Отправить комментарий