С#: множественные уловки
Рассмотрим следующее:
try {
FileStream fileStream = new FileStream("C:\files\file1.txt", FileMode.Append); }
catch (DirectoryNotFoundException e)
{ MessageBox.Show("Directory not found. " + e.Message); }
catch (IOException e)
{ MessageBox.Show("Other IO Error. " + e.Message); }
catch (Exception e)
{ MessageBox.Show("Other Error. " + e.Message); }
Будет ли исключение DirectoryNotFoundException
обрабатываться всеми тремя предложениями catch
или только первым?
Ответы
Ответ 1
Просто первый. Исключение не распространяется на все сопоставленные предложения catch.
Из спецификации С# 4, раздел 8.9.5:
Первые предложения catch
, указывающие тип исключения или базовый тип типа исключения, считаются совпадением. [...] Если найдено подходящее предложение catch
, распространение исключений завершается передачей управления блоку этого предложения catch
.
Здесь "завершенная" часть указывает, что после того, как управление было перенесено, это конец специальной обработки, эффективно.
Ответ 2
Только первый. Уловы не проваливаются.
Ответ 3
Только первый совпадающий catch поймает исключение, если вам по какой-то причине нужно снова cacth, вам придется снова его выбросить, чтобы "внешние" уловы вылома могли его поймать.
Ответ 4
только 1-й, 1-я соответствующая команда catch будет обрабатывать исключение
Ответ 5
Это правильный способ обработки исключений - начните с самого конкретного типа исключения и вернитесь назад. Однако помните, что если вы не можете ничего сделать, чтобы разрешить или обработать исключение, не поймите его. Например, я предполагаю, что ваш код находится в некотором способе доступа к файлу, я бы удалил последний блок catch (Exception), так как здесь вы ничего не можете сделать (что, если это переполнение стека, нехватка памяти или некоторые другое серьезное системное исключение...)