2009-09-26 2 views
34

Что произойдет, если оба catch и finally блокируют исключение?Что произойдет, если оба catch и finally блокируют исключение?

+0

Существуют различные комбинации | гнездовые модели возможно как с уловом и финально блок. Возможно, вы захотите добавить фрагмент кода, чтобы описать ситуацию, о которой вы думаете. –

+0

@Justin: (Не уверен, что вы будете уведомлены об этом ...) Я отменил изменение тэга, потому что (1) вы удалили Java, что резко изменило диапазон вопросов и (2) вы добавили VB. NET, которая во многих отношениях правильна не так, как это делается здесь ... (другими словами, я согласен с этим или удаляю C#, а также вижу, что .NET существует). –

+0

@MarkHurd Проблема в том, что один или несколько ответов ссылаются на .Net конкретные решения - я не могу говорить о достоверности ответов на Java. Также у других вопросов VB.Net есть ссылки на этот вопрос (так как ответ один и тот же). – Justin

ответ

32

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

+0

были искушены сделать это, чтобы убедиться, что я контролирую каждое сообщение об исключении из моего кода блока внутри try. Я отдельно бросаю исключение –

4

Последнее исключение брошено.

6

Когда catch выдает исключение, блок finally будет запущен, а затем выйдет с исключением. Если блок finally выдает исключение, блок выйдет с исключением.

+0

так, наконец, какое исключение будет выброшено? из блока finally или из блока catch? – Arthur

+4

Последнее исключение. : D – NawaMan

4

Его уже ответили хорошо adrianbanks, но следующий пост должен быть интересным: Interesting Exception Results: Throwing Exceptions From the Finally Block

+0

Я добавил комментарий к блогу, но результат Console Application, похоже, связан с тем, что CLR сообщает (первое) необработанное исключение во время фазы фильтра (когда обрабатывается предложение '' When 'VB.NET '), , вероятно, так, что можно вызвать отладчик, а затем найти строку первого исключения. Это наиболее просто отметили, напечатав что-то в 'finally' перед' throw'. Первое исключение записывается в журнал, затем обрабатывается 'finally' и регистрируется второе исключение. Это происходит для .NET Framework с 1.1 по 3.5. .NET 4.0 сообщает только о первом исключении. (1.0 и 4.5 недоступны.) –

-4

HI Nwaman я думаю, что вы ответили неправильно я тестировал в окнах appliaction, я нашел, если и написать программу, как ниже один

try 
{ 
    string s = "hu"; 
    int i = int.Parse(s); 
} 
catch (Exception ex) 
{ 
    string s = "hu"; 
    int i = int.Parse(s); 
    throw new Exception(); 
} 
finally 
{ 
    MessageBox.Show("hi"); 
} 

и это не приведет, наконец, для преобразования приложений,

+2

Хм, я просто попробовал это и, наконец, действительно выполнил. – agentnega