← Все вопросы

Почему ловлю исключение в try/catch, но программа всё равно падает?

Задан 16 месяцев назад1.3к просмотров3 ответа
10

Обернул код в try/catch, но приложение всё равно вылетает. Что я делаю не так?

try
{
    await DoWorkAsync();
}
catch (FormatException)
{
    Console.WriteLine("поймал");
}

Исключение вроде ловится, но падает с другим типом.

3 ответа

17
✓ Принятый ответ — помог автору

Скорее всего, вы ловите не тот тип исключения. 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).

7

Ещё одна частая причина именно при async: если метод объявлен как async void, исключение из него нельзя поймать снаружи через try/catch — оно уходит в SynchronizationContext и роняет приложение.

Делайте async Task вместо async void (кроме обработчиков событий) — тогда try { await ... } сработает корректно.

3

Проверьте также, не выбрасываете ли вы новое исключение в самом блоке catch или в finally — оно «перекроет» исходное и тоже может уронить программу, если его никто не ловит выше по стеку.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект