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