web-dev-qa-db-ja.com

Java例外のcatchブロックでアサーションエラーがキャッチされますか?

コード:-

try {
    Assert.assertEquals("1", "2");
} catch (Exception e) {
    System.out.println("I am in error block");
}

Assert文が失敗した場合、catchブロックでエラーをキャプチャしたいと思います。私は上記のコードを試していますが、それは起きていません。

アサーションエラーは、Java例外のcatchブロックでキャッチされますか?

31
Galet

あなたはほとんど自分の質問に答えました。 catchブロックは、AssertionErrorである(または、より具体的には_Java.lang.Error_を拡張する)ため、Assertが失敗した場合にスローするErrorをキャッチしません。 詳細については、docs を参照してください。 catchブロックは、 _Java.lang.Exception_ を拡張するThrowableオブジェクトのみをキャッチします

あなたは本当にそれをキャッチしたい場合-あなたが使用する必要があります

_catch (AssertionError e) {
...
_

ただしothers have 言及 、これはアサーションを使用する非常に珍しい方法です-通常はパスする必要があり、失敗した場合、プログラムの実行を続行することは非常に珍しいです。これが、失敗がErrorではなくExceptionをスローする理由です。 this questionErrorをキャッチする(しない)ことの詳細を読むことができます。

ただテストしたくないだけですか?if ( variableName == "1")

[〜#〜] nb [〜#〜]マッチャーなどの単体テストヘルパーコードをテストしている場合は、 AssertionError

45
J Richard Snape

さて、テストの作成にJUnitを使用していると思います。その場合、Assert.assertEquals()をキャッチしないでください。通常のテスト実行に合格する必要があるためです。例外がスローされた場合、コードが本来どおりに実行されていないことを意味します。

2
Aakash

その方法でエラーをキャッチするには、次のようなものが必要です。

if (num == 1 || num == 2) {
    throw new Exception();
}

独自の例外クラスを作成して、必要なメッセージを渡すことができます。

0
SpaceCowboy

ExceptionErrorの両方のインスタンスをキャッチしたい場合:

...
catch (Throwable t)
{
...
}

ExceptionErrorの両方がThrowableを拡張するため。

0
wilmol