2015-04-16 8 views
16

Code: -Wird ein Assertion-Fehler in einem catch-Block für Java-Ausnahme abgefangen?

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

Wenn die Assertion-Anweisungen fehlschlägt, würde Ich mag die Fehler in dem catch-Block erfassen. Ich versuche mit dem obigen Code und es passiert nicht.

Wird der Assertion-Fehler in einem catch-Block für Java-Ausnahme abgefangen?

+2

Warum möchten Sie das trotzdem tun? Dies scheint ein grober Missbrauch von 'Assert' zu sein, der für Unit Testing gedacht ist. – Dragondraikk

Antwort

27

Sie haben Ihre eigene Frage fast beantwortet. Ihr catch-Block wird nicht die AssertionError fangen, die die Assert löst, wenn es fehlschlägt, weil es eine Error (oder genauer gesagt, es erweitert java.lang.Error) ist. See the docs für weitere Informationen zu diesem Thema. Ihr Fang Block fängt nur Throwable Objekte, die java.lang.Exception

verlängern, wenn Sie es wirklich wollen fangen - Sie

catch (AssertionError e) { 
... 

jedoch, wie othersmentioned haben, ist dies eine sehr ungewöhnliche Art und Weise verwenden, müssen Assertionen zu verwenden - sie sollten normalerweise bestehen und wenn sie ausfallen, ist es sehr ungewöhnlich für Sie, die Programmausführung fortzusetzen. Deshalb löst der Fehler Error statt Exception aus. Sie können mehr über (nicht) fangen Error in this question lesen.

Sind Sie sicher, dass Sie nicht nur einen Test wünschen - if (variableName == "1")?

NB Wenn Sie den Unit-Test-Hilfscode wie einen Matcher testen, ist es möglicherweise sinnvoll, die AssertionError zu erfassen.

+0

Wenn man sehen möchte, ob eine Unit-Test Helper-Klasse das Richtige tut (durch Unit-Testing ;-)), würde man erwarten, einen solchen AssertionError zu bekommen. Das wäre eine gültige Situation, um es zu fangen, oder? – gkephorus

+0

@gkephorus ja, ich nehme an, es könnte sein. Fühlen Sie sich frei, das als "N.B." zu bearbeiten. Wenn Sie möchten, und ich werde es genehmigen :) –

+0

@JRichardSnape - Ich möchte zwei Java-Objekte (von Json-Objekten erhalten), die nur String-Variablen mit Getters & Setter, d. h. POJO haben. Ich möchte nur einige (nicht alle) der Variablen vergleichen, um eine Übereinstimmung zu bestimmen. 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 setzen? Auf diese Weise kann ich im Catch-Teil false zurückgeben, um anzuzeigen, welches Feld nicht übereinstimmt, mit einer sinnvollen Fehlermeldung. Auf diese Weise muss ich nicht mehrere andere schreiben. Klingt gut? – testerjoe2

2

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

+0

Ja, mein Assert-Code löst eine Ausnahme aus. Aber ich möchte alle Fehler wie Assertions oder andere Fehler von Exception-Klasse erfassen. Wie kann ich es tun ? – karan

+2

Sie können nicht. "AssertionError" erbt von "Error", was bedeutet, dass "try ... catch" nicht in der Lage ist, mit ihnen umzugehen. Siehe hier https://docs.oracle.com/javase/7/docs/api/java/lang/AssertionError.html. Wenn Sie sie trotzdem fangen müssen, sehen Sie sich die Antwort von SpaceCowboy an. – Aakash

2

Wenn Sie die Fehler in dieser Art und Weise fangen wollen, müssen Sie etwas wie folgt aus:

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

Sie könnten Ihre eigene Exception-Klasse erstellen und wollen in der Nachricht, die Sie übergeben.