Wird ein Assertionsfehler in einem Catch-Block für eine Java-Ausnahme abgefangen?

Lesezeit: 4 Minuten

Galets Benutzeravatar
Galet

Code:-

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

Wenn die Assert-Anweisungen fehlschlagen, möchte ich den Fehler im Catch-Block erfassen. Ich versuche es mit dem obigen Code und es passiert nicht.

Wird der Assertionsfehler in einem Catch-Block für eine Java-Ausnahme abgefangen?

  • Warum willst du das überhaupt tun? Dies scheint ein grober Missbrauch von zu sein Assert was für Unit-Tests gedacht ist

    – Dragondraikk

    16. April 2015 um 10:25

J Richard Snapes Benutzeravatar
J Richard Snape

Sie haben Ihre Frage fast selbst beantwortet. Ihr Catch-Block wird das nicht fangen AssertionError dass die Assert wirft, wenn es fehlschlägt, weil es ein ist Error (oder genauer gesagt, es erstreckt sich java.lang.Error). Siehe die Dokumente Weitere Informationen hierzu finden Sie hier. Ihr Catch-Block fängt nur Throwable Objekte, die sich ausdehnen java.lang.Exception

Wenn Sie es wirklich fangen wollen, müssen Sie es verwenden

catch (AssertionError e) {
...

Jedoch, wie andere bereits erwähnt haben, ist dies eine sehr ungewöhnliche Art, Behauptungen zu verwenden – sie sollten normalerweise erfolgreich sein, und wenn sie fehlschlagen, ist es sehr ungewöhnlich, dass Sie die Programmausführung fortsetzen möchten. Deshalb wirft der Fehler eine Error eher als ein Exception. Lesen Sie mehr über das (Nicht-)Fangen Error in dieser Frage.

Wenn Sie nur den Variablenwert testen möchten, verwenden Sie ihn vorzugsweise if ( variableName == "1")

NB Wenn Sie Unit-Test-Hilfscode wie einen Matcher testen, kann es sinnvoll sein, den abzufangen AssertionError.

  • Wenn man sehen möchte, ob eine Unit-Test-Hilfsklasse das Richtige tut (indem man sie einem Unit-Test unterzieht 😉 ), würde man erwarten, einen solchen AssertionError abfangen zu können. Das wäre eine gültige Situation, um es zu fangen, nicht wahr?

    – gkephorus

    18. Januar 2016 um 8:05

  • @gkephorus ja, ich nehme an, das könnte sein. Wenn Sie möchten, können Sie das gerne als „NB“ bearbeiten und ich werde es genehmigen 🙂

    – J Richard Snape

    18. Januar 2016 um 9:49

  • @JRichardSnape – Ich möchte zwei Java-Objekte (erhalten aus JSON-Objekten), die nur String-Variablen haben, mit Gettern und Settern, z. B. POJO, vergleichen. Ich möchte nur einige (nicht alle) Variablen vergleichen, um eine Übereinstimmung festzustellen. Für eine der Variablen sollte nur ein Teilwert verglichen werden. Ist es eine gute Idee, alle meine Behauptungen in einen try-catch(AssertionError)-Block zu packen? Auf diese Weise kann ich im Catch-Teil „false“ zurückgeben, um anzuzeigen, welches Feld nicht übereinstimmt, und zwar mit einer nützlichen Fehlermeldungszeichenfolge. Auf diese Weise muss ich sonst nicht mehrere schreiben. Klingt ok?

    – MasterJoe

    9. März 2018 um 5:46


  • Gegenüber: „Hinweis: Wenn Sie Unit-Test-Hilfscode wie einen Matcher testen, kann es sinnvoll sein, den AssertionError abzufangen.“ – Ich würde die Verwendung empfehlen org.junit.rules.ExpectedException.handleAssertionErrors()

    – josle

    7. Februar 2019 um 16:36 Uhr


  • catch (AssertionError e) { } wird in meinem Fall nicht in Anspruch genommen. Du sollst nicht fangen AssertionError ist hier das Mantra.

    – daparisch

    2. Januar 2020 um 10:16 Uhr

Wenn Sie beides fangen möchten Exception Und Error Instanzen verwenden:

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

Da beides Exception Und Error erweitern Throwable.

Nun, ich glaube, Sie verwenden JUnit zum Schreiben Ihrer Tests. In diesem Fall sollten Sie sich nicht anstecken Assert.assertEquals() weil sie für die normale Testausführung bestehen sollten. Wenn eine Ausnahme ausgelöst wird, bedeutet dies, dass Ihr Code nicht ordnungsgemäß funktioniert.

  • Ja, mein Assert-Code löst eine Ausnahme aus. Aber ich möchte alle Fehler wie Behauptungen oder andere Fehler nach der Exception-Klasse erfassen. Wie kann ich es tun ?

    – Galet

    16. April 2015 um 10:28

  • Das kannst du nicht. AssertionError erbt von Error was bedeutet try...catch werde nicht in der Lage sein, damit umzugehen. Siehe hier docs.oracle.com/javase/7/docs/api/java/lang/AssertionError.html. Wenn Sie sie trotzdem fangen müssen, lesen Sie die Antwort von SpaceCowboy.

    – Aakash

    16. April 2015 um 10:33


  • @Aakash, das ist falsch – das funktioniert gut: try { throw new AssertionError(); } catch( AssertionError e){ System.out.println("ok");}

    – Danyamachine

    21. August 2018 um 19:37 Uhr

  • @danyamachine wie gesagt, wir sollen nicht fangen AssertionError oder irgendein Error übrigens. Fehler dienen dazu, dem Entwickler mitzuteilen, dass ein Fehler aufgetreten ist und das Programm nicht fortgesetzt werden sollte. Es ist eine späte Antwort, aber besser spät als nie 🙂

    – Aakash

    20. Okt. 2019 um 16:18 Uhr

Wenn Sie die Fehler auf diese Weise abfangen möchten, benötigen Sie etwa Folgendes:

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

Sie könnten Ihre eigene Ausnahmeklasse erstellen und die gewünschte Nachricht übergeben.

1451530cookie-checkWird ein Assertionsfehler in einem Catch-Block für eine Java-Ausnahme abgefangen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy