2011-09-27 18 views
9

私はそれの後にいくつかの異なるキャッチで試しています。例外がスローされた場合にのみ実行する必要がある「クリーンアップ」コードがあります。私は各例外に同じコードを追加することができますが、それはメンテナンスの悪夢になります。基本的には、finally文のようなものが欲しいですが、例外がスローされた場合にのみ実行されます。例外がスローされた場合にのみコードを実行する方法はありますか?

これは可能ですか?

+0

これらのランタイムエラーは、あなたがキャッチしているのか、自分のビジネスエラーです。 – Shahzeb

+0

IOException、ClientProtocolException、UnsupportedEncodingExceptionなど – Bromide

答えて

18

これは残念なことに直接サポートはありません。どのようにこの

boolean successful = false; 
try { 
    // do stuff 
    successful = true; 
} catch (...) { 
    ... 
} finally { 
    if (!successful) { 
     // cleanup 
    } 
} 
1

のようなものについては、私は考えることができる唯一のことは、それぞれのキャッチに変数を設定し、最終的にその変数をチェックすることです。

擬似コード:

Boolean caught = false; 

try { 

    //risky code here 

catch(err) { 
    caught = true; 
    // Do other stuff 
} 
catch(err) { 
    caught = true; 
    // Do other stuff 
} 
catch(err) { 
    caught = true; 
    // Do other stuff 
} 
finally { 
    if (caught) { 
     // Do clean up 
    } 

} 
0

は、なぜあなたは、単純な試み&キャッチを使用していませんか?

try 
{ 
    foo(); 
} 
catch(Exception1 e1) 
{ 
    dealWithError(1); 
} 
catch(Exception2 e2) 
{ 
    dealWithError(2); 
} 
catch(Exception3 e3) 
{ 
    dealWithError(3); 
} 

... 

private void dealWithError(int i) 
{ 
    if(i == 1) // deal with Exception1 
    else if(i == 2) // deal with Exception2 
    else if(i == 3) // deal with Exception3 
} 
+2

正確に何も身体を実行する必要はありません。 'もし'の通りの悪夢。 – Shahzeb

1

私は、各例外に同じコードを追加することもできますが、それは、メンテナンスの悪夢になります。

それとも、「例外」消し去ろ場合:

を私はそれぞれ[場所]に、同じコードを追加することもできますが、それは、メンテナンスの悪夢になります。

これは何のための方法です。

private void cleanup() { /* clean up */ } 

... 

try { 
    // oh noes 

} catch (MyException me) { 
    cleanup(); 
} catch (AnotherException ae) { 
    cleanup(); 
} 

メンテナンスが面倒!

+2

これ以外は、発信者の中のものにはアクセスできません。それがクリーンアップが必要なものなら、あなたはホースです。そして、あなたがうんざりしたものを渡すならば、修正するべきもののリストをハードコーディングしています。そしてそのリストが後で変わるならば、それを使用するすべての場所を変更する必要があります。そしてあなたは1つを欠場するでしょう。 – cHao

+0

ああ、このクリーンアップ関数は、あなたがそれを持っていると主張するならば、必ず「私的」であるべきです。 – cHao

+0

@cHao確かに、そして確かにより良いですが、あなたが1つの場所を欠場すれば、コードはコンパイルされないので、それほど悪くはありません – Voo

0

あなたは例外ハンドラの二つの層をラップしてみてください、あなたは一般的な取り扱いをした後に、例外を再スローできます。私は本当にこのソリューションのように

try { 
     try { 
      // your code goes here 

     } catch (Throwable t) { 
      // do common exception handling for any exception 
      throw t; 
     }  

    } catch (NullPointerException nx) { 
     // handle NPE 
    } catch (Throwable t) { 
     // handle any other exception 
    } 

わからないけれども... Aのビットのように感じていますハック。私はおそらく、各インスタンスで明示的に処理されたExceptionを参照することになります。これは、何らかの種類の共有クリーンアップ関数を呼び出すことを繰り返しても意味します。

関連する問題