私はそれの後にいくつかの異なるキャッチで試しています。例外がスローされた場合にのみ実行する必要がある「クリーンアップ」コードがあります。私は各例外に同じコードを追加することができますが、それはメンテナンスの悪夢になります。基本的には、finally文のようなものが欲しいですが、例外がスローされた場合にのみ実行されます。例外がスローされた場合にのみコードを実行する方法はありますか?
これは可能ですか?
私はそれの後にいくつかの異なるキャッチで試しています。例外がスローされた場合にのみ実行する必要がある「クリーンアップ」コードがあります。私は各例外に同じコードを追加することができますが、それはメンテナンスの悪夢になります。基本的には、finally文のようなものが欲しいですが、例外がスローされた場合にのみ実行されます。例外がスローされた場合にのみコードを実行する方法はありますか?
これは可能ですか?
これは残念なことに直接サポートはありません。どのようにこの
boolean successful = false;
try {
// do stuff
successful = true;
} catch (...) {
...
} finally {
if (!successful) {
// cleanup
}
}
のようなものについては、私は考えることができる唯一のことは、それぞれのキャッチに変数を設定し、最終的にその変数をチェックすることです。
擬似コード:
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
}
}
は、なぜあなたは、単純な試み&キャッチを使用していませんか?
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
}
正確に何も身体を実行する必要はありません。 'もし'の通りの悪夢。 – Shahzeb
私は、各例外に同じコードを追加することもできますが、それは、メンテナンスの悪夢になります。
それとも、「例外」消し去ろ場合:
を私はそれぞれ[場所]に、同じコードを追加することもできますが、それは、メンテナンスの悪夢になります。
これは何のための方法です。
private void cleanup() { /* clean up */ }
...
try {
// oh noes
} catch (MyException me) {
cleanup();
} catch (AnotherException ae) {
cleanup();
}
メンテナンスが面倒!
これ以外は、発信者の中のものにはアクセスできません。それがクリーンアップが必要なものなら、あなたはホースです。そして、あなたがうんざりしたものを渡すならば、修正するべきもののリストをハードコーディングしています。そしてそのリストが後で変わるならば、それを使用するすべての場所を変更する必要があります。そしてあなたは1つを欠場するでしょう。 – cHao
ああ、このクリーンアップ関数は、あなたがそれを持っていると主張するならば、必ず「私的」であるべきです。 – cHao
@cHao確かに、そして確かにより良いですが、あなたが1つの場所を欠場すれば、コードはコンパイルされないので、それほど悪くはありません – Voo
あなたは例外ハンドラの二つの層をラップしてみてください、あなたは一般的な取り扱いをした後に、例外を再スローできます。私は本当にこのソリューションのように
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を参照することになります。これは、何らかの種類の共有クリーンアップ関数を呼び出すことを繰り返しても意味します。
これらのランタイムエラーは、あなたがキャッチしているのか、自分のビジネスエラーです。 – Shahzeb
IOException、ClientProtocolException、UnsupportedEncodingExceptionなど – Bromide