Почему ловлю исключение в try/catch, но программа всё равно падает?
Обернул код в try/catch, но приложение всё равно вылетает. Что я делаю не так?
try
{
await DoWorkAsync();
}
catch (FormatException)
{
Console.WriteLine("поймал");
}
Исключение вроде ловится, но падает с другим типом.
3 ответа
Скорее всего, вы ловите не тот тип исключения. catch (FormatException) перехватит только FormatException и его наследников. Если внутри летит, например, ArgumentNullException — он пролетит мимо, и программа упадёт.
Варианты решения:
try
{
await DoWorkAsync();
}
catch (FormatException ex)
{
Console.WriteLine($"Формат: {ex.Message}");
}
catch (ArgumentException ex) // более общий тип ниже
{
Console.WriteLine($"Аргумент: {ex.Message}");
}
catch (Exception ex) // ловит всё остальное
{
Console.WriteLine($"Прочее: {ex.Message}");
}
Важные правила:
- Порядок
catchидёт от частного к общему — иначе компилятор ругнётся, что общий блок перехватит всё раньше. - Не пишите пустой
catch {}— глотает ошибки молча. - В фоновых
async voidметодах необработанные исключения могут ронять процесс — используйтеasync Task.
Посмотрите в логе реальный тип исключения и ловите именно его (или базовый Exception).
Ещё одна частая причина именно при async: если метод объявлен как async void, исключение из него нельзя поймать снаружи через try/catch — оно уходит в SynchronizationContext и роняет приложение.
Делайте async Task вместо async void (кроме обработчиков событий) — тогда try { await ... } сработает корректно.
Проверьте также, не выбрасываете ли вы новое исключение в самом блоке catch или в finally — оно «перекроет» исходное и тоже может уронить программу, если его никто не ловит выше по стеку.