Выбор ответа Middle Исключения обновлено

Фильтры исключений when

Вопрос

Чем catch (HttpRequestException e) when (e.StatusCode == HttpStatusCode.NotFound) лучше, чем проверка внутри catch с повторным throw;?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Фильтр работает до раскрутки стека, и при false исключение летит нетронутым. Фильтр when вычисляется на первом проходе обработки, когда стек ещё не раскручен.

Варианты ответа

  1. Фильтр перехватывает исключения из всех потоков процесса, а не только из текущего
  2. С фильтром не выполняются блоки finally, и исключение летит быстрее
  3. Фильтр автоматически логирует исключение вместе с исходным стеком вызовов
  4. Фильтр работает до раскрутки стека, и при false исключение летит нетронутымправильный ответ

Разбор

Фильтр when вычисляется на первом проходе обработки, когда стек ещё не раскручен. Если условие ложно, блок catch не считается найденным, и исключение летит дальше, как будто этого catch нет. При catch с throw; стек уже раскручен до этого места, и в аварийном дампе контекст потерян. Фильтры не влияют на другие потоки, finally выполняются как обычно, логирования сами не делают (хотя трюк when (Log(e)) с возвратом false применяют).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.