Подтвердить что ты не робот

С#: множественные уловки

Рассмотрим следующее:

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 или только первым?

4b9b3361

Ответ 1

Просто первый. Исключение не распространяется на все сопоставленные предложения catch.

Из спецификации С# 4, раздел 8.9.5:

Первые предложения catch, указывающие тип исключения или базовый тип типа исключения, считаются совпадением. [...] Если найдено подходящее предложение catch, распространение исключений завершается передачей управления блоку этого предложения catch.

Здесь "завершенная" часть указывает, что после того, как управление было перенесено, это конец специальной обработки, эффективно.

Ответ 2

Только первый. Уловы не проваливаются.

Ответ 3

Только первый совпадающий catch поймает исключение, если вам по какой-то причине нужно снова cacth, вам придется снова его выбросить, чтобы "внешние" уловы вылома могли его поймать.

Ответ 4

только 1-й, 1-я соответствующая команда catch будет обрабатывать исключение

Ответ 5

Это правильный способ обработки исключений - начните с самого конкретного типа исключения и вернитесь назад. Однако помните, что если вы не можете ничего сделать, чтобы разрешить или обработать исключение, не поймите его. Например, я предполагаю, что ваш код находится в некотором способе доступа к файлу, я бы удалил последний блок catch (Exception), так как здесь вы ничего не можете сделать (что, если это переполнение стека, нехватка памяти или некоторые другое серьезное системное исключение...)