.NET Throwing Custom Exceptions

Может ли кто-нибудь пролить свет на плюсы и минусы бросать пользовательские исключения (которые наследуются из System.Exception) или их правильный способ? Я уже знаю, когда/когда не бросать исключение, но я ищу руководство по созданию собственных пользовательских исключений.

Ответ 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, не было бы возможности различать разные причины, по которым было выбрано исключение.

Ответ 3

Используйте собственные исключения для ошибок флага, которые относятся к вашему приложению/домену. Преимущество заключается в том, что ваши блоки catch могут фильтровать правильные исключения и действовать на это. Используйте специальные стандартные исключения для всего остального.

Ответ 4

Пользовательские исключения позволяют предоставлять четкие и значимые исключения, которые, в свою очередь, могут сделать вашу библиотеку более пригодной для использования, если вы когда-нибудь используете существующие исключения.

Создайте настраиваемое исключение в любое время, когда вам нужно создать исключение, которое не подходит непосредственно в модели исключения фреймов.

Ответ 5

Недавно я написал всю запись в блоге по этому вопросу:

Основное резюме, хотя...

Вы должны создать только новое исключение, если вы ожидаете, что разработчики предпримут корректирующие действия для проблемы или залогинят для отладки post mortem.

Ответ 6

Зачем создавать пользовательские исключения?
Для плюсов и минусов использования исключений см. Как отбросить хорошее исключение
Факторы, которые следует учитывать при использовании пользовательских исключений
Рекомендации по созданию пользовательских исключений
Создание и удаление исключений