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


105

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


2
そして、私はcatch(Exception e){}でこれらの特定の例外をすべてキャッチしますか?
ヨハナ

ええ。Exceptionはすべての例外の基本クラスであるため、すべての例外をキャッチします。
jjnguy 2009

1
@ jjnguy:あなたの良い説明をありがとう。
ヨハナ

お役に立てて嬉しいです。
jjnguy 2009

回答:


111

必要に応じて、メソッドにスロー句を追加できます。そうすれば、チェックされたメソッドをすぐにキャッチする必要はありません。そうすれば、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){
}

95

生の例外をキャッチするのは良いスタイルではないことに同意しますが、優れたロギングを提供する例外を処理する方法と、予期しないものを処理する機能があります。例外的な状態にあるので、おそらく応答時間よりも良い情報を取得することに関心があるので、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;
    }
}

12
複数のcatchブロックを使用しないのはなぜですか?
カールG

1
各例外を明示的にキャッチする必要があると私は主張しますが、質問では、コードのブロックがスローするすべてのものをキャッチする方法を明示的に尋ねました。
codethulhu 2014

そのスローアブルは役に立ちました。
Anshul 2014年

これは私が探していたソリューションであり、例外処理のために別のifが必要でした。ありがとう
CubeJockey 2015

スローチップは本当に便利です。
cherryhitech 2017年

15

基本例外「例外」をキャッチ

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

8
このコードを書いた場合、ほぼ間違いなく何かひどいことが起こっています。
ジョージ

2
@ジョージどうしてそんなこと言ったの?
kuchi

10
@George必ずしもそうではありませんが、機密性の高いエントリパラメータがたくさんあるものを扱い、それぞれの有効性を検証することが非常に複雑な場合は、作業ケースが適切にテストされたら、あらゆる種類の例外をキャッチする方法です。 。これにより、巨大で潜在的に重い状態よりもコードが明確になり、mindf * kが少なくなります。
Johnride 2013年

2
私が使用したほとんどのコーダーは、catchステートメントに何も入れていません。そのため、このtry catchスニペットを使用する方が、さまざまな例外タイプの束をキャッチして何もしないよりも実際に優れています
Lou Morda

1
@LouisMorda同意しない、すべてのExceptionサブクラスをキャッチし、それらに基づいて何もしない(それらを無視する)のは、特定の例外をキャッチして無視するよりも悪いです。いくつかの例外タイプをキャッチし、その情報で何もしない場合、それらの状況で何が問題であったかを知る機会はありませんが、すべての例外サブクラスをキャッチした場合、非常に多くの数で何が問題であったかを知る機会がありません。状況の。スタックトレースやメッセージなど、例外からの情報なしでバグレポートを処理する方法を検討してください。
zpon 2015

6

例外をキャッチすることは悪い習慣です- 例外が広すぎるため、独自のコードでNullPointerExceptionのようなものを見逃す可能性があります。

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


1
例外をキャッチすることは悪い習慣です。どうして?悪い投票の説明
Pedro Sequeira

4

はいあります。

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

4

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

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

3

特定の例外だけではなく、スローされるException任意のタイプのをキャッチすることを意味しますか?

その場合:

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

具体的でないものに対してはどうしたらいいですか?
Johanna

そして、私はcatch(Exception e){}でこれらの特定の例外をすべてキャッチしますか?
Johanna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.