web-dev-qa-db-fra.com

Une erreur d'assertion sera-t-elle interceptée dans un bloc catch pour Java exception?

Code:-

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

Si les instructions assert échouent, je voudrais capturer l'erreur dans le bloc catch. J'essaie avec le code ci-dessus et ce n'est pas le cas.

L'erreur d'assertion sera-t-elle détectée dans un bloc catch pour Java exception?

31
Galet

Vous avez presque répondu à votre propre question. Votre bloc catch n'attrapera pas le AssertionError que le Assert lance s'il échoue, car il s'agit d'un Error (ou, plus précisément, il étend Java.lang.Error ). Voir la documentation pour plus d'informations à ce sujet. Votre bloc catch n'attrape que Throwable objets qui s'étendent Java.lang.Exception

Si vous voulez vraiment l'attraper - vous devez utiliser

catch (AssertionError e) {
...

Cependant, comme d'autres ont mentionné , ceci est une façon très inhabituelle d'utiliser les assertions - elles devraient généralement réussir et si elles échouent, il est très inhabituel que vous souhaitiez continuer l'exécution du programme. C'est pourquoi l'échec lance un Error plutôt qu'un Exception. Vous pouvez en savoir plus sur (pas) la capture de Error dans cette question .

Êtes-vous sûr de ne pas vouloir simplement un test - if ( variableName == "1")?

[~ # ~] nb [~ # ~] si vous testez du code auxiliaire de test unitaire, comme un matcher, il peut être judicieux d'attraper le AssertionError.

45
J Richard Snape

Eh bien, je crois que vous utilisez JUnit pour écrire vos tests. Dans ce cas, vous ne devez pas intercepter votre Assert.assertEquals() car elle doit passer pour l'exécution normale du test. S'il lève une exception, cela signifie que votre code ne fonctionne pas comme il se doit.

2
Aakash

Si vous souhaitez détecter les erreurs de cette manière, vous avez besoin de quelque chose comme ceci:

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

Vous pouvez créer votre propre classe d'exception et transmettre le message souhaité.

0
SpaceCowboy

Si vous voulez intercepter les instances Exception et Error, utilisez:

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

Puisque Exception et Error étendent Throwable.

0
wilmol