web-dev-qa-db-ja.com

ファイルの読み取りと書き込みによってスローされるすべての例外をキャッチするにはどうすればよいですか?

Javaでは、例外を個別にキャッチする代わりに、すべてのexceptionsを取得(キャッチ)する方法はありますか?

93
Johanna

必要に応じて、メソッドに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){
}
105
jjnguy

生の例外をキャッチするのは良いスタイルではないことに同意しますが、優れたロギングを提供する例外を処理する方法と、予期しないものを処理する機能があります。あなたは例外的な状態にあるので、おそらく応答時間よりも良い情報を取得することに関心があるので、パフォーマンスのインスタンスが大ヒットすることはないはずです。

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;
    }
}
90
codethulhu

基本例外「Exception」をキャッチします

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }
14
Allan

キャッチするのは悪い習慣ですException-それはあまりにも広すぎます、そしてあなたはあなた自身のコードでNullPointerExceptionのような何かを見逃すかもしれません。

ほとんどのファイル操作では、IOExceptionがルート例外です。代わりにそれをキャッチする方が良いです。

5
Alex Feinman

はいあります。

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}
4

単一のcatchブロックで複数の例外をキャッチできます。

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 
3

特定の例外とは対照的に、スローされたtypeExceptionをキャッチするということですか?

その場合:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}
2
JoshJordan