時々、私は見る
try {
} catch(Throwable e) {
}
そして時折
try {
} catch(Exception e) {
}
違いはなんですか?
キャッチThrowable
することで、サブクラスのものが含まれますError
。おそらく、ログに記録したいスレッドの非常に高い「すべてをキャッチ」レベルで、またはその他の方法で問題が発生する可能性のあるすべてのものを完全に処理する場合を除いて、通常はこれを行わないでください。フレームワークタイプのアプリケーション(アプリケーションサーバーやテストフレームワークなど)では、不明なコードを実行でき、そのコードで問題が発生した場合に可能な限り影響を受けないようにするのが一般的です。
Throwable
Exception
だけでなくのスーパークラスですError
。Exception
通常の場合、根本原因が失われないように、常にのサブクラスをキャッチする必要があります。
Javaコードを制御できない問題が発生する可能性がある特別な場合にのみ、Error
またはをキャッチする必要がありますThrowable
。
Throwableをキャッチして、ネイティブライブラリがロードされていないことを示すフラグを立てたことを覚えています。
Throwable
Thread.stop()
現在非推奨のメソッドからスレッドを停止するためにデフォルトでスローされるThreadDeathでさえ、実際にすべてをキャッチします。したがって、キャッチThrowable
することで、少なくともキャッチブロックを通過せずに、tryブロックを離れることは決してないことを確認できますが、OutOfMemoryError
およびInternalError
またはを処理する準備をする必要がありますStackOverflowError
。
キャッチThrowable
は、あらゆる種類のリクエストを外部コードに委任する外部サーバーループに最も役立ちますが、サービスを存続させるためにそれ自体が終了することはありません。
私は人々がThrowableを使用して、インフラストラクチャの障害/可用性の欠如が原因で発生する可能性のあるいくつかのエラーをキャッチするのを見てきました。