2013-03-25 8 views
3
try 
{ 
    // throws IOException 
} 
catch(Exception e) 
{ 
} 
catch(IOException e) 
{ 
} 

когда try блока бросает IOException он будет вызывать первый catch не блок второй. Может ли кто-нибудь дать объяснение этому. Почему он назовет первый блок catch?заказа при попытке обработать исключение

+1

Будет ли это компилировать? – V4Vendetta

ответ

0

Они улавливаются в указанном вами порядке. В вашем случае вы должны положить IOException выше Exception. Всегда держите Exception последним.

0

Причина заключается в том, что происходит от IOExceptionException, так что на самом деле IOExceptionявляетсяExceptionis-a») и, следовательно, первые catch обработчика матчей и в настоящее время введены.

6

От try-catch (C# Reference);

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

Вы должны использовать

try 
{ 
    // throws IOException 
} 
catch(IOException e) 
{ 
} 
catch(Exception e) 
{ 
} 

Имейте в виду, Exception класс является базовым классом для всех исключений.

+1

+1 для ссылки msdn – Habib

0

IOException унаследовано от Exception. Все исключения. Когда вы сначала поймаете Exception, вы поймаете все исключения (включая IOException). Убедитесь, что ваш catch (Exception e) является последним уловом в списке, иначе вся обработка исключений будет проигнорирована.

1

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

Так попробуйте использовать IOCException перед Exception

Вы можете увидеть иерархию IOCException here

Смежные вопросы