指定:Throwable
はException
のスーパークラスです。
独自の「例外」の記述に関するテキストを読むと、Throwable
ブロックで使用されているcatch
の例や、catch
ブロックで使用されているnew Exception()
の例を見ることができます。それぞれをいつ使用すべきかの説明はまだありません。
私の質問はこれです。いつThrowable
を使用する必要があり、いつnew Exception()
を使用する必要がありますか?
catch
またはelse
ブロック内で、次のいずれかを使用します。
throw throwable;
または
throw new Exception();
(コメントから)これをもたらした問題は、コレクションがビルドされない場合、同僚がビルドしているコードに「例外」を渡す必要があるということです。
その場合、チェック済み例外をスローすることができます。 Exception
、適切な既存のサブクラス( RuntimeException
およびunchecked)、またはException
のカスタムサブクラス(例: "CollectionBuildException
")。 例外に関するJavaチュートリアル を参照して、Java例外を理解してください。
常にException
をスローします(Throwable
は使用しないでください)。通常、Throwable
もキャッチしませんが、できます。 ThrowableはException
およびError
のスーパークラスです。したがって、Throwable
sだけでなくException
sもキャッチしたい場合は、Error
をキャッチします。それがそれのポイントです。問題は、Error
sは通常、通常のアプリケーションではキャッチできず、キャッチすべきでないものなので、Exception
を使用する特別な理由がない限り、Throwable
を使用するだけです。
例外を実際にキャッチして、「新しい例外」のような一般的な例外をスローするべきではありません。
代わりに、例外をバブルアップする場合は、次を実行します。
try {
// Do some stuff here
}
catch (DivideByZeroException e) {
System.out.println("Can't divide by Zero!");
}
catch (IndexOutOfRangeException e) {
// catch the exception
System.out.println("No matching element found.");
}
catch (Throwable e) {
throw e; // rethrow the exception/error that occurred
}
元の例外の原因を回避するのに十分なコンテキストを提供する便利なカスタム例外を発生させない限り、例外をキャッチし、コードブロックに発生した例外の代わりに新しい例外をスローすることは良いプラクティスではないと思います。
コードでWord Throwable
が表示されるのは2箇所のみです。
public static void main(String args[])
{
try
{
// Do some stuff
}
catch(Throwable t)
{
}
}
そして
public class SomeServlet extends HttpServlet
{
public void doPost(HttpRequest request, HttpResponse response)
{
try
{
// Do some stuff
}
catch (Throwable t)
{
// Log
}
}
}
Throwableはインターフェースであり、クラスではありません。 Throwableを拡張する2つのクラス、ExceptionとError。
ルールは次のとおりです。例外をキャッチするときは、できる限り具体的にします。たとえば、Throwableの代わりにExceptionをキャッチし、Exceptionの代わりにIOExceptionをキャッチします。
エラーをキャッチしない-エラーはバグです。代わりにコードを修正してください。
絶対にすべてをキャッチする必要がある場合は、「catch Throwable」を使用しますが、これは不適切な形式です。
throw new Exception();
は、catchブロックでneverを実行する必要がありますが、代わりにnew SomeException(throwable);
(完全なスタックトレースを保持)を実行する必要があるか、実行したい場合があります。メソッドのAPIに準拠するための_throw throwable;
_ SomeException
をスローするよう宣言しているが、メソッドのIOException
句に追加したくないthrows
をスローする可能性のあるコードを呼び出している場合。
おそらく最も一般的なケースは、throws
句を完全に回避するためのnew RuntimeException(throwable);
です。多くの人が、これは恐ろしい虐待だと言うでしょう。なぜなら、あなたはチェック例外を使うべきだからです。 IMOは間違っており、チェックされた例外はJava言語設計の誤りであり、justい、保守不能なコードになります。
Javaが最初に出てきたときに聞いたように、例外はThrowableが例外以外の他の場合に制御の転送に使用されるかもしれないという理論でした。おそらく非常に良いこと)。
したがって、例外をキャッチするだけです(または、さらに優れた、よりきめの細かい例外)。
Throwableは、プログラムのコンテナーまたはメインループによってのみキャッチされることを意図しています。 VirtualErrorや他のエラーがスローされた場合にできることは何でもできるのに、ほとんどの場合、例外、たとえばErrorの下にあるものをキャッチすると、プログラムに多くの機能が追加されません。ログを記録して続行する以外はあまりありません。
すべての例外は最終的には問題です...エラーはバグであると言っても何の意味もありません。
エラーはバグではなく、ホストVMで発生している問題です。たとえば、OutOfMemoryError。例外は、現在の操作が失敗したことを通知し、おそらく診断を提供する手段です。
通常、Throwableを投げたりキャッチしたりすることはありません。特に、JVMエラー(Error()を拡張する)はmeantではなく、奇妙なシステムレベルの作業を行っている場合を除き、ユーザーコードによってキャッチされます。
「Throwable」を言語アーティファクトとして扱います。 「例外」クラスは、プログラマーがコードブロックを「例外的に」終了するときに使用することを目的としているため、正常に終了しないか値を返すことにより、名前が付けられます。
これには、通常のエラー状況(JVMエラーではなく「通常」という意味)と、制御メカニズムとして例外を使用している場所の両方が含まれます。
例外を「戻り値の型」として使用しないでください...
スローする条件が一般的な場合、その条件を呼び出しルーチンに返すために膨大なリソースを費やしています。例外の構築には費用がかかります。
私は、例えば、 ID割り当て、このルーチンはCPU時間の約99%を占めていました。代わりに文書化された戻り定数に変更すると、25%に低下しました。