Как обрабатывать ошибки в .NET
Что проверяют
Понимаете ли вы, когда исключение уместно, а когда это просто ожидаемый результат, и знаете ли особенности .NET: фильтры, повторный выброс, поведение в async. Следом обычно спрашивают, как устроена глобальная обработка ошибок в ASP.NET Core.
Как отвечать
Разделите ошибки на два вида. Ожидаемые, вроде невалидного ввода или отсутствующей записи, выражаются возвращаемым значением: int.TryParse, TryGetValue, паттерн Result. Исключения оставьте для того, что код не может обработать на месте: упала сеть, заблокирован файл, нарушен инвариант. Выброс исключения заметно дороже обычного возврата, управлять через него потоком не стоит.
Механика:
try/catch/finally: ловите конкретные типы, от частного к общему. Для ресурсов удобнееusingиawait usingсIDisposableиIAsyncDisposable;- фильтры:
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound). Если условие ложно, стек не раскручивается, исключение идёт дальше нетронутым; - повторный выброс:
throw;сохраняет стек,throw ex;его обнуляет. Для переброса из другого места естьExceptionDispatchInfo.Capture(ex).Throw(); - свои исключения: наследник
Exceptionс суффиксомException, исходную ошибку передавайте вinnerException; - async: исключение лежит в
Taskи выбрасывается наawait..Resultи.Wait()заворачивают его вAggregateException, аasync voidроняет процесс, потому что его исключение ловить некому; - ASP.NET Core:
UseExceptionHandler()вместе сAddProblemDetails()отдаёт ошибки в формате Problem Details (RFC 9457), с .NET 8 для своих обработчиков естьIExceptionHandler.
Логируйте через ILogger<T> шаблонами с параметрами, чтобы Serilog или OpenTelemetry получили структурированные поля, и передавайте в метод само исключение, а не ex.Message.
Где спотыкаются
Пишут пустой catch (Exception) { } и глотают ошибку. Приложение работает дальше в испорченном состоянии, а в логах пусто.
Используют throw ex; и теряют место, где ошибка возникла на самом деле.
Логируют OperationCanceledException как ошибку. Это нормальная отмена запроса клиентом, и она только засоряет алерты.