Javaでは、例外を個別にキャッチする代わりに、すべてのexceptions
を取得(キャッチ)する方法はありますか?
必要に応じて、メソッドにthrows句を追加できます。そうすれば、すぐにチェック済みのメソッドをキャッチする必要はありません。そうすれば、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){
}
生の例外をキャッチするのは良いスタイルではないことに同意しますが、優れたロギングを提供する例外を処理する方法と、予期しないものを処理する機能があります。あなたは例外的な状態にあるので、おそらく応答時間よりも良い情報を取得することに関心があるので、パフォーマンスのインスタンスが大ヒットすることはないはずです。
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;
}
}
基本例外「Exception」をキャッチします
try {
//some code
} catch (Exception e) {
//catches exception and all subclasses
}
キャッチするのは悪い習慣ですException-それはあまりにも広すぎます、そしてあなたはあなた自身のコードでNullPointerExceptionのような何かを見逃すかもしれません。
ほとんどのファイル操作では、IOExceptionがルート例外です。代わりにそれをキャッチする方が良いです。
はいあります。
try
{
//Read/write file
}catch(Exception ex)
{
//catches all exceptions extended from Exception (which is everything)
}
単一のcatchブロックで複数の例外をキャッチできます。
try{
// somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
// handle exception.
}
特定の例外とは対照的に、スローされたtypeのException
をキャッチするということですか?
その場合:
try {
//...file IO...
} catch(Exception e) {
//...do stuff with e, such as check its type or log it...
}