2011-05-17 2 views
1

Я пытаюсь поймать исключение, используя блок try-catch-finally. я поймал исключение в блоке catch и передал его в блок finally, используя глобальную переменную исключения. Таким образом, я обработал сценарий исключения в блоке finally. Я знаю, что это звучит странно, но это необходимо сделать. Пожалуйста, дайте мне знать, если есть какая-то стандартная проблема кодирования с тем же. Также, если вы можете что-то предложить, я буду действительно обязан.Help with Exception handlin in finally block

Спасибо.

+0

В чем нуждаются? Вы могли бы просто избавиться от блога 'catch' и блокировать« finally ». – rkg

+3

Вы не пропускаете исключения из блоков finally. –

+1

Не могли бы вы прояснить проблему, которую вы пытаетесь решить? Существует, безусловно, лучший способ решить эту проблему! –

ответ

4

catch должен поймать исключение и выполнить любую необходимую обработку исключений. Блок finally предназначен для очистки всех оставшихся открытых ресурсов, таких как дескрипторы файлов, подключения к базам данных и т. Д. Этот блок будет делать большую часть времени и, следовательно, является правильным местом для очистки, но не обработает сами исключения, они должны быть рассмотрены в блоке catch.

+4

Not _always_: http://stackoverflow.com/questions/1141502/why-does-this-finally-execute/1141801#1141801 –

+0

@Rick: Thx для указания этого! –

2

try-catch-finally pattern - очень полезный и мощный образец, если используется по назначению. Обработка исключений в блоке finally равна не Рекомендуется и не делает много (никаких?) Смысла.
Попробуйте изменить свой код, чтобы он соответствовал шаблону, а не наоборот.

Небольшой пример:

var reader = new StreamReader(path); 
try 
{ 
    // Do your work here 
    reader.ReadToEnd(); 
} 
catch (IOException ex) 
{ 
    // Handle specific error here 
    ShowUserError(ex.Message); 
} 
catch (Exception ex) 
{ 
    // Handle general error here 
    LogError(ex); 
} 
finally 
{ 
    // Perform clean up here 
    // This code will run regardless if there was an error or not 
    reader.Close(); 
} 

Кроме того, посмотрите на документацию MSDN для Try...Catch...Finally Statements.