2012-05-17 5 views
1

Я посмотрел на несколько других вопросов try catch finally, но я не уверен, что на этот ответ был дан ответ. Есть ли запах плохо делать что-то вроде:Try/Catch/Наконец, используйте исключение из Catch in finally?

Exception? ex = null; 
try { //something } 
catch (Exception e) { ex = e ;} 
finally { 
    DoSomething();   
} 
... //more code 

//end of method 
if (ex !=null) { throw ex; } 

В принципе, я пытаюсь обеспечить определенный код (за пределами TRY/улова/наконец) выполняется и что исключение, если один случается, но до тех пор, пока указанный код не запустится. Я не могу поместить весь код в блок finally, потому что он вне некоторых условных выражений.

Если это действительно так, плохо пахнет (я подозреваю, что это так), как бы добиться этого?

+0

Какие полезные вещи вы делаете в местах внутри этого улова и после того, как, наконец, это запрет на удаление улова в целом и распространение исключения? Я думаю, если вы «выбросите ex», вы получите меньше информации позже, когда поймаете его (например, источник и тому подобное). –

ответ

6

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

Если вы не можете поместить дополнительный код в существующих, наконец, вы создаете вложенные try..finally блоков:

try { 
    try { //something } 
    finally { 
     DoSomething();   
    } 
    ... //more code 
} 
finally { 
    // cleanup code 
} 

Примечание Из OP: см this code для того, что автор этот ответ привел меня правильно вывести.

+0

Я все еще хочу исключить исключение. где я его брошу в этом примере? – Jason

+0

'throw;' в конце второго блока finally {} будет отменять исключение, оставив след стека неизменным. – TheEvilPenguin

+0

@ TheEvilPenguin - throw в конце второго блока finally является синтаксической ошибкой. – shf301

0

Поскольку вы хотите запустить «больше кода» даже в случае исключения, почему бы не добавить «больше кода» в конце? Это по сути то, что, наконец, для - это guarenteed выполнить, даже если исключение происходит

так:

try { 
    // something 
} catch (Exception e) { 

    ***// more code here*** 

    DoSomething(); 
    throw; 
} 

Хранение ех и бросить ех; проглотит внутренние ожидания. Вы хотите бросить; чтобы ничто в стеке не проглотило.

+1

Я упомянул в конце сообщения, что я не могу поместить весь код в 'finally', потому что он находится вне некоторых условных операторов. – Jason