Может ли кто-нибудь пролить свет на плюсы и минусы бросать пользовательские исключения (которые наследуются из System.Exception) или их правильный способ? Я уже знаю, когда/когда не бросать исключение, но я ищу руководство по созданию собственных пользовательских исключений.
.NET Throwing Custom Exceptions
Ответ 1
Это отличные посты. До сих пор я согласен с Брайаном Расмуссеном - создавать пользовательские исключения, когда вы хотите обрабатывать различные типы конкретных исключений.
Возможно, пример поможет. Это надуманный пример, который может или не может быть полезен в повседневном коде. Предположим, у вас есть класс, ответственный за аутентификацию пользователя. Этот класс, помимо аутентификации пользователя, имеет механизм блокировки для блокировки пользователя после нескольких неудачных попыток. В таком случае вы можете создать часть пользовательских исключений класса 2: AuthenticationFailedException
и UserLockedOutException
. Затем ваш метод AuthenticateUser
просто возвращается без металирования, если пользователь был успешно аутентифицирован, throw AuthenticationFailedException
, если пользователь не прошел аутентификацию, или выбросил UserLockedOutException
, если пользователь был заблокирован.
Например:
try
{
myAuthProvider.AuthenticateUser(username, password);
ShowAuthSuccessScreen();
}
catch(AuthenticationFailedException e)
{
LogError(e);
ShowAuthFailedScreen();
}
catch(UserLockedOutException e)
{
LogError(e);
ShowUserLockedOutScreen();
}
catch(Exception e)
{
LogError(e);
ShowGeneralErrorScreen();
}
Опять же, надуманный пример. Но, надеюсь, это показывает, как и почему вы хотите создавать пользовательские исключения. В этом случае пользователь класса AuthProvider
обрабатывает каждое настраиваемое исключение по-другому. Если метод AuthenticateUser
просто бросил Exception
, не было бы возможности различать разные причины, по которым было выбрано исключение.
Ответ 2
На самом деле существует большая серия статей MSDN по этой теме:
Ответ 3
Используйте собственные исключения для ошибок флага, которые относятся к вашему приложению/домену. Преимущество заключается в том, что ваши блоки catch могут фильтровать правильные исключения и действовать на это. Используйте специальные стандартные исключения для всего остального.
Ответ 4
Пользовательские исключения позволяют предоставлять четкие и значимые исключения, которые, в свою очередь, могут сделать вашу библиотеку более пригодной для использования, если вы когда-нибудь используете существующие исключения.
Создайте настраиваемое исключение в любое время, когда вам нужно создать исключение, которое не подходит непосредственно в модели исключения фреймов.
Ответ 5
Недавно я написал всю запись в блоге по этому вопросу:
- http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx
Основное резюме, хотя...
Вы должны создать только новое исключение, если вы ожидаете, что разработчики предпримут корректирующие действия для проблемы или залогинят для отладки post mortem.
Ответ 6
Зачем создавать пользовательские исключения?
Для плюсов и минусов использования исключений см. Как отбросить хорошее исключение
Факторы, которые следует учитывать при использовании пользовательских исключений
Рекомендации по созданию пользовательских исключений
Создание и удаление исключений