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: со специфичным типом исключения стек-трейс сохранился бы и место падения было бы видно
