действителен ли этот код обработки исключений - PullRequest
0 голосов
/ 07 сентября 2010

Будут ли поражены оба пойманных блока?

try
{
    DoSomething();
}
catch (AuthenticationException e)
{
    throw;
}
catch (Exception e)
{
    throw new AuthenticationException("Hello ");
}

Ответы [ 8 ]

8 голосов
/ 07 сентября 2010

Это допустимо (в том смысле, что оно будет компилироваться, собираться и запускаться), но это не очень хорошая практика.

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

В ответ на ваше редактирование оба блока catch не будут обработаны.

Если поднят AuthenticationException, первый блок будетвыполнено, для любого другого исключения будет выполнен второй блок.

3 голосов
/ 07 сентября 2010

Будет поражен только один блок исключения.И они идут по порядку, поэтому, если DoSomething() выдает исключение AuthenticationException, будет запущен первый блок catch.

Тем не менее, я бы, вероятно, вообще не использовал здесь try / catches, если бы вы толькоотбрасывание исключений.Это не очень хорошая практика.По крайней мере, убедитесь, что вы добавили исходное исключение во второй улов в качестве InnerException создаваемой вами AuthenticationException:

catch(Exception e) 
{
    throw new AuthenticationException(e.Message, e);
}
2 голосов
/ 07 сентября 2010

Этот код генерирует исключение AutheniticationException, если DoSomething что-то выбрасывает. Это будет то же исключение, если DoSomething создает исключение AuthenticationException или новое исключение в любом другом случае.

Примечание: это не очень хорошая практика:

  1. Вы теряете все детали исключения, которое не является AuthenticationException
  2. Зачем вы генерируете здесь исключение AuthenticationException, если базовый код считает, что что-то не так? Кодовый запах для меня.
0 голосов
/ 07 сентября 2010

Одно преимущество, которое я вижу для перехвата и пересылки исключения, заключается в передаче сообщения: «Запрошенная операция не выполнена, но состояние системы по существу такое же, как до операции». Хотя перехват всех исключений во внутренней подпрограмме и надежда на то, что ни одно из них не представляет проблемы, которая должна привести к завершению основной программы, несколько странны, я не уверен, какой альтернативный дизайн лучше. Можно засорять код:

  If Not Integer.TryParse(inputString, inputVar) Then
    Throw New MyApp.FileLoadException("Whatever")
  EndIf

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

0 голосов
/ 07 сентября 2010

Второй блок не будет перехватывать переброшенное исключение из первого блока.

0 голосов
/ 07 сентября 2010

Если DoSomething () генерирует исключение AuthenticationException, тогда будет использоваться

catch (AuthenticationException e)

.Для всех других типов исключений:

catch (Exception e)

Но вы не должны создавать новое AuthenticationException во втором улове.

0 голосов
/ 07 сентября 2010

Нет.Оба блока перехвата не будут обработаны.

Если DoSomething создает исключение AuthenticationException, оно будет перехвачено и переброшено.

Если DoSomething создает любое другое исключение, новое сообщение AuthenticationException будет выдано с сообщением"Привет".

0 голосов
/ 07 сентября 2010

Да , если у вас есть различные виды исключений.(2 исключения)

Нет , если вы хотите, чтобы первый блок прибыл во второй.(1 исключение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...