Javaではexceptions
、例外を個別にキャッチするのではなく、すべてを取得(キャッチ)する方法はありますか?
Javaではexceptions
、例外を個別にキャッチするのではなく、すべてを取得(キャッチ)する方法はありますか?
回答:
必要に応じて、メソッドにスロー句を追加できます。そうすれば、チェックされたメソッドをすぐにキャッチする必要はありません。そうすれば、exceptions
後者を(おそらく他のと同時にexceptions
)キャッチできます。
コードは次のようになります。
public void someMethode() throws SomeCheckedException {
// code
}
その後、後で対処することができます exceptions
、そのメソッドで処理したくない場合ます。
すべての例外をキャッチするために、コードの一部のブロックがスローされる場合があります(これExceptions
は、自分が書いたものもキャッチします)。
try {
// exceptional block of code ...
// ...
} catch (Exception e){
// Deal with e as you please.
//e may be any type of exception at all.
}
機能する理由Exception
は、すべての例外の基本クラスだからです。したがって、スローされる可能性のある例外はException
(大文字の 'E')です。
独自の例外を最初に処理する場合はcatch
、一般的な例外ブロックの前にブロックを追加するだけです。
try{
}catch(MyOwnException me){
}catch(Exception e){
}
生の例外をキャッチするのは良いスタイルではないことに同意しますが、優れたロギングを提供する例外を処理する方法と、予期しないものを処理する機能があります。例外的な状態にあるので、おそらく応答時間よりも良い情報を取得することに関心があるので、instanceofのパフォーマンスは大きな打撃にはならないはずです。
try{
// IO code
} catch (Exception e){
if(e instanceof IOException){
// handle this exception type
} else if (e instanceof AnotherExceptionType){
//handle this one
} else {
// We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
throw e;
}
}
ただし、これはIOがエラーをスローすることもあるという事実を考慮していません。エラーは例外ではありません。エラーは例外とは異なる継承階層の下にありますが、どちらも基本クラスThrowableを共有しています。IOはエラーをスローする可能性があるので、Throwableをキャッチするまで行ってください。
try{
// IO code
} catch (Throwable t){
if(t instanceof Exception){
if(t instanceof IOException){
// handle this exception type
} else if (t instanceof AnotherExceptionType){
//handle this one
} else {
// We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
}
} else if (t instanceof Error){
if(t instanceof IOError){
// handle this Error
} else if (t instanceof AnotherError){
//handle different Error
} else {
// We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
}
} else {
// This should never be reached, unless you have subclassed Throwable for your own purposes.
throw t;
}
}
基本例外「例外」をキャッチ
try {
//some code
} catch (Exception e) {
//catches exception and all subclasses
}
例外をキャッチすることは悪い習慣です- 例外が広すぎるため、独自のコードでNullPointerExceptionのようなものを見逃す可能性があります。
ほとんどのファイル操作では、IOExceptionがルート例外です。代わりに、それをキャッチする方が良いでしょう。
はいあります。
try
{
//Read/write file
}catch(Exception ex)
{
//catches all exceptions extended from Exception (which is everything)
}
1つのcatchブロックで複数の例外をキャッチできます。
try{
// somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
// handle exception.
}