Есть ли разница при отлове исключений не такого типа:

try
{
    ...
}
catch (TaskCanceledException)
{
    throw;
}
catch (Exception exception)
{
    ...
}

А также :

try
{
    ...
}
catch (Exception exception) when (!(exception is TaskCanceledException))
{
    ...
}
c#
8
Troopers 2 Май 2019 в 10:39

3 ответа

Лучший ответ

Да, есть.

Во втором блоке кода вы фильтруете по общему типу исключения. Это не предназначено для фильтрации, что происходит, если выбрасывается «TaskCanceledException»? Вы не обрабатываете это, и это будет перерастать в код приложения. На самом деле вы не должны фильтровать что-либо для типа «Исключение», поскольку он является родителем для всех других типов исключений и является последней точкой обработки исключения. Лучшим вариантом было бы создать пользовательское исключение и поместить их в отдельный блок catch и отфильтровать их при необходимости.

Первый вариант более правильный по сравнению со вторым. Хотя вы не должны бросать какие-либо исключения и держаться подальше от них, если только это не нарушает условия сделки. Вдобавок к этому, какой смысл ставить блок catch с типом исключения ниже TaskCanceledException блок захвата, который генерирует исключение? Вы в основном говорите, что «Я бы хотел обработать все исключения» при использовании catch с типом Exception, но в то же время вы через одно исключение в исключительном случае. Или бросьте оригинальное исключение или обработайте их.

Надеюсь, это имеет смысл.

2
vsarunov 2 Май 2019 в 07:56

Сначала ловит все TaskCanceledException

Второй фильтрует исключения, которые (не) TaskCanceledException.

Зачем?

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

Это в основном означает, что при использовании предложения when вы можете проверять исключение, не прерывая его курс.

1
Bebolicious 2 Май 2019 в 07:47

Перейдите по этой ссылке Stackoverflow

Блоки Catch уже позволяют фильтровать по типу исключения:

catch (SomeSpecificExceptionType e) {...}

Предложение when позволяет расширить этот фильтр для обобщенных выражений.

Таким образом, вы используете предложение when для случаев, когда тип исключения недостаточно различим, чтобы определить, должно ли исключение обрабатываться здесь или нет.

0
Daniel Attard 2 Май 2019 в 07:43