C #: несколько предложений catch - PullRequest
17 голосов
/ 21 марта 2011

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

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

Ответы [ 5 ]

27 голосов
/ 21 марта 2011

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

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

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

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

3 голосов
/ 21 марта 2011

Только первый совпадающий улов ловит исключение. Если вам по какой-либо причине потребуется снова ввести его в действие, вам придется бросить его снова, чтобы «внешние» вызовы улова могли его поймать.

3 голосов
/ 21 марта 2011

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

1 голос
/ 21 марта 2011

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

1 голос
/ 21 марта 2011

только 1-е, первое соответствующее предложение catch обработает исключение

...