Фильтры исключений when
Вопрос
Чем catch (HttpRequestException e) when (e.StatusCode == HttpStatusCode.NotFound) лучше, чем проверка внутри catch с повторным throw;?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Фильтр перехватывает исключения из всех потоков процесса, а не только из текущего
- С фильтром не выполняются блоки
finally, и исключение летит быстрее - Фильтр автоматически логирует исключение вместе с исходным стеком вызовов
- Фильтр работает до раскрутки стека, и при
falseисключение летит нетронутымправильный ответ
Разбор
Фильтр when вычисляется на первом проходе обработки, когда стек ещё не раскручен. Если условие ложно, блок catch не считается найденным, и исключение летит дальше, как будто этого catch нет. При catch с throw; стек уже раскручен до этого места, и в аварийном дампе контекст потерян. Фильтры не влияют на другие потоки, finally выполняются как обычно, логирования сами не делают (хотя трюк when (Log(e)) с возвратом false применяют).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.