1

try catch finallyここで他のいくつかの質問を見てきましたが、これが回答されているかどうかはわかりません. 次のようなことをするのは臭いですか?

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

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

基本的に、特定のコード (try/catch/finally の外側) が実行され、例外が発生した場合は例外がスローされるようにしようとしていますが、そのコードが実行されるまではそうではありません。finally一部の条件の外側にあるため、すべてのコードをブロックに入れることはできません。

これが実際に悪臭を放つ場合 (私はそう思う)、どうすればこれを達成できるでしょうか?

4

2 に答える 2

6

それは間違いなくコードの匂いです。メソッドの最後で例外を再スローすると、例外の呼び出しスタックが上書きされるため、すべての例外が実際に発生した場所ではなく、メソッドの最後で発生したように見えます。

既存の finally に追加のコードを配置できない場合は、ネストされた try..finally ブロックを作成します。

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

OPからの注意:この回答の作成者が私を正しく導き出したものについては、このコードを参照

于 2012-05-17T05:28:09.987 に答える
0

Since you want to run "more code" even in the event of an exception, why not put "more code" in the finally? That's essentially what the finally is for - it's guarenteed to execute even if an exception happens

so:

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

    ***// more code here***

    DoSomething();
    throw;
}

Storing ex and throw ex; will swallow inner expections. You want throw; to ensure nothing in the stack is swallowed.

于 2012-05-17T05:24:42.263 に答える