Имеющий Что Сказать
Зарегистрирован: 15 February 2005
Сообщения: 65
Примеры кода: 0
|
RE: Стоит ли ловить Exception |
10 July 2008 18:08 |
|
|
|
|
Добрый день.
Задумался над таким вопросом стоит ли ловить все Exception, чтобы в случаи ошибки выводить пользователю user friendly сообщения.
Пример.
Приложение состоит из трех слоев. DataAccess, BussinessLogic, Presentation
Все exception, которые произошли в DataAccess без изменений передаются в BussinessLogic. Exception которые произошли в BL либо передаются в Presentation без изменений, либо ловятся и в Presentation кидается какой-то custom Exception, который может содеражать дополнительные сведения.
В presentation ловятся абсолютно все exceptions. Если таковые произошли, то информация о них логируется (в БД, письмо, в event viewer ...), а пользователю показывается сообщение в стиле "An error occured. Please contact your sysadmin" или что-то в таком духе. Так как сообщение ни очем не говорит, то показывать его при любой ошибки тоже смысла нет, т.е. если произошла ошибка при подключении к базе, то лучше вывести более информационное сообщение.
Псевдокод.
Presentation:... try{ BussinessLogic.DoSomething(); } catch(SqlException sqlEx){ AddExceptionToLog(sqlEx); ShowError("DB Error");} catch(Exception ex){ AddExceptionToLog(ex); ShowError("General Error");} ...
На сколько мне известно ловить именно Exception не рекомендуется, а ловить нужно только специфические exception.
Кто что думает по этому поводу и как вы поступаете в подобных ситуациях?
Думаю что только объект (модуль) в котором произошло исключение может точно знать по отношению к чему оно произошло, соответственно только этот объект может представить более детализированную информацию в виде исключения и передать его выше уровнем или запротоколировать дружественную к пользователю инфу. Объект выше уровнем ,который получит это исключение, может сгенерить на это свое исключение с детальной инфой актуальной для него + информация передаваемая с первичным исключением и тд. К концу прохождения цепочки, на уровне презентации получится исключение с дружественной инфой для пользователя. Ковсему прочему можно создать исключения вида
class FrendlyExeption:Exeption {...}
При возникновении исключения на одном из уровней в случае его значимости генерировать исключение Frendly типов , к ним со стороны системы будет особое внимание, например вывод пользователю на экран и тд.
Вобщем логику обработки исключений можно придумать как душе угодно.
|
|