web-dev-qa-db-ja.com

try catchでThrowableとExceptionを使用することの違い

時々見ます

try {

} catch(Throwable e) {

}

時には

try {

} catch(Exception e) {

}

違いはなんですか

250
jax

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

205
Yishai

最初のものは Throwable (これには ExceptionError )、2番目のサブクラスは Exception のすべてのサブクラスをキャッチします。

Errorは、プログラムで回復することはできません。通常、ログ記録の目的(再度通過する)を除いて、キャッチされません。 Exceptionはプログラムで回復可能です。そのサブクラスRuntimeExceptionはプログラミングエラーを示し、通常は同様にキャッチされません。

147
BalusC

Throwableは、ExceptionErrorのスーパークラスです。通常は、Exceptionのサブクラスを常にキャッチして、根本原因が失われないようにする必要があります。

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

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

18
rai.skumar

Thowableは、現在廃止されているThread.stop()メソッドからスレッドを停止するためにデフォルトでスローされるThreadDeathでさえ、本当にすべてをキャッチします。したがって、Throwableをキャッチすることで、少なくともcatchブロックを経由せずにtryブロックを終了することはありませんが、OutOfMemoryErrorInternalErrorまたはStackOverflowErrorも処理できるように準備する必要があります。

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

14
x4u