トライキャッチでのThrowableとExceptionの使用の違い


回答:


247

キャッチするThrowableことにより、サブクラス化するものが含まれErrorます。おそらく、ログに記録したいスレッドの最も高い「すべてをキャッチ」レベルで実行するか、そうでなければ、問題が発生する可能性のあるすべてを完全に処理する場合を除いて、通常はこれを行わないでください。フレームワークタイプのアプリケーション(アプリケーションサーバーやテストフレームワークなど)では、不明なコードが実行されている可能性があり、そのコードで問題が発生することによる影響をできるだけ受けないほうが一般的です。


30
おそらく、ここで階層の少しを説明するのが最善でしょう。
Xonatron、2012

11
この回答のコンテキスト:Throwableには、エラーと例外の両方がサブクラスとして含まれているため、最初のtry / catchには2番目が含まれますが、通常は広範囲です。
Noel、

2
また、Throwableのユーザー定義の直接サブクラスとThrowable自体のインスタンスも含まれます。あなたが書くthrow new Throwable();ことを妨げるものは何もないので、それがすべてを本当にキャッチする唯一の方法です。
アンチモン2016年

3
受け入れられましたが、これは質問への回答ではありません。ほとんどの回答は、例外とスロー可能の両方をキャッチするためのベストプラクティスを説明しており、質問はその違いに関するものでした(どちらを使用するかなど)。「それはエラーをサブクラス化するものを含んでいます」指定された唯一の違いであり、それは本当に包括的な答えです:エラーとは何ですか?それが含まれていることがなぜ重要なのですか?その他の違いやベストプラクティスはありますか?
Oded Niv

@OdedNiv「エラーとは何ですか?含まれていることがなぜ重要なのですか?」別の質問で質問できます。
Kronen

182

最初のものはThrowable(これを含むExceptionおよびError)のすべてのサブクラスをキャッチし、2番目はのすべてのサブクラスをキャッチしますException

Errorロギングの目的(それが再び通過する)を除いて、プログラムで何らかの方法で回復できず、通常は捕捉されません。Exceptionプログラムで回復可能です。そのサブクラスRuntimeExceptionはプログラミングエラーを示し、通常は捕捉されません。


37
驚くべきことに、この回答から4年が経過しても、ほとんどの「コード分析」ツールは、スロー可能キャッチを重大なエラーとして報告します。ロギングは、Throwableをキャッチするための非常に有効な理由です。サーバーの開発年数は、1)を取得してもログが発生するError、2)ログがない場合、OOMが発生したことを通知されない可能性があり、サーバーがなぜ「おかしい」動作を開始したのか疑問に思う
Bruno Grieder

4
programmatically unrecoverable正確にはどういう意味ですか?それが非常に厳しいので、JVMから予期しない動作が発生する可能性がない限り、それをキャッチした後(ロギングなど)に基本的にJavaメソッドを呼び出すことはできませんか?
Alexander Abakumov 2017

Its subclass RuntimeException indicates a programming error:私がこの声明に同意するかどうかはわかりません。それが真の場合、それはすべての予期される例外がチェック例外であるべきであることを意味します。何かが失敗する可能性があり、自分のアプリケーションで回復できないと予想しても、少なくとも意味のある例外をスローしたい場合はどうなりますか?その場合、チェック済み例外を使用しても役に立たないようで、定型コードが作成されます。
Nom1fan

22

ThowableデフォルトでスローされるThreadDeathでさえ、実際にはすべてをキャッチして、現在非推奨のThread.stop()メソッドからスレッドを停止します。したがって、キャッチThrowableすることで、少なくともキャッチブロックを通過せずにtryブロックを離れることはありませんが、処理OutOfMemoryErrorおよびInternalError/またはStackOverflowError

キャッチThrowableは、あらゆる種類の要求を外部コードに委任するが、サービス自体を維持するためにそれ自体が終了することはない外部サーバーループに最も役立ちます。


21

ThrowableExceptionだけでなくのスーパークラスですError。通常の場合、常にサブクラスをキャッチする必要がありますException、根本的な原因が失われないよう、があります。

Javaコードを制御できない問題が発生する可能性がある特殊な場合のみ、Errorまたはをキャッチする必要がありThrowableます。

ネイティブライブラリが読み込まれていないことを示すためにThrowableをキャッチしたことを覚えています。


0

私は人々がThrowableを使用して、インフラ障害/非可用性が原因で発生する可能性があるいくつかのエラーをキャッチするのを見てきました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.