Вступить в клуб →
средняявопросC# и ASP.NET Core

throw ex в блоке catch: что теряется при таком перевыбросе

В сервисе оплаты обработка ошибок написана так:

try
{
    await _payments.ChargeAsync(order);
}
catch (Exception ex)
{
    _logger.LogError(ex.Message);
    throw ex;
}

Продакшн-инцидент: в логах видно только текст «Object reference not set to an instance of an object», и найти место падения не удаётся. Что здесь сделано неправильно?

  • `throw ex` заменяет исходный стек вызовов точкой перевыброса, а `ex.Message` не пишет в лог ни стек, ни внутренние исключения
  • Исключение будет проглочено и до глобального обработчика не дойдёт, поэтому логи и обрывались
  • `throw ex` оборачивает исключение в новое, из-за чего теряется исходный тип исключения
  • Проблема только в том, что ловится общий Exception: со специфичным типом исключения стек-трейс сохранился бы и место падения было бы видно

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела