¿Se detectará un error de aserción en un bloque catch para la excepción de Java?

4 minutos de lectura

Avatar de usuario de Galet
Galet

Código:-

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

Si las declaraciones de afirmación fallan, me gustaría capturar el error en el bloque catch. Estoy intentando con el código anterior y no está sucediendo.

¿Se detectará el error de aserción en un bloque catch para la excepción de Java?

  • ¿Por qué querrías hacer eso de todos modos? Esto parece un grave mal uso de Assert que está destinado a pruebas unitarias

    – Dragondraikk

    16 de abril de 2015 a las 10:25

Avatar de usuario de J Richard Snape
J Richard Snape

Casi has respondido a tu propia pregunta. Su bloque catch no atrapará el AssertionError que el Assert tira si falla, porque es un Error (o, más específicamente, se extiende java.lang.Error). ver los documentos para obtener más información sobre esto. Tu bloque catch solo atrapa Throwable objetos que se extienden java.lang.Exception

Si realmente quieres atraparlo, debes usar

catch (AssertionError e) {
...

Sin embargo, como han mencionado otros, esta es una forma muy inusual de usar aserciones: por lo general, deberían pasar y si fallan, es muy inusual que desee continuar con la ejecución del programa. Por eso el fracaso arroja un Error en lugar de un Exception. Puedes leer más sobre (no) atrapar Error en esta pregunta

Si solo desea probar el valor de la variable, se prefiere usar if ( variableName == "1")

NÓTESE BIEN si está probando el código auxiliar de prueba unitaria, como un comparador, podría tener sentido capturar el AssertionError.

  • Cuando uno quiere ver si una clase auxiliar de prueba unitaria está haciendo lo correcto (mediante pruebas unitarias ;-)), uno esperaría poder detectar tal AssertionError. Esa sería una situación válida para atraparlo, ¿no?

    – gkephorus

    18 de enero de 2016 a las 8:05

  • @gkephorus sí, supongo que podría ser. Siéntase libre de editar eso como un “NB” si lo desea y lo aprobaré 🙂

    –J Richard Snape

    18 de enero de 2016 a las 9:49

  • @JRichardSnape: quiero comparar dos objetos java (obtenidos de objetos json) que solo tienen variables de cadena con captadores y definidores, es decir, POJO. Solo quiero comparar algunas (no todas) de las variables para determinar una coincidencia. Para una de las variables, solo se debe comparar el valor parcial. ¿Es una buena idea poner todas mis afirmaciones en un bloque try catch (AssertionError)? De esa manera, puedo devolver falso en la parte de captura para indicar qué campo no coincide, con una cadena de mensaje de error útil. De esta manera, no tendré que escribir varios if else. Suena bien ?

    – MaestroJoe

    9 de marzo de 2018 a las 5:46


  • Con respecto a: “NB, si está probando el código auxiliar de prueba unitaria, como un comparador, podría tener sentido detectar el AssertionError” – Recomendaría usar org.junit.rules.ExpectedException.handleAssertionErrors()

    – josle

    7 febrero 2019 a las 16:36


  • catch (AssertionError e) { } no se invoca en mi caso. no atraparás AssertionError es el mantra aquí.

    – daparic

    2 de enero de 2020 a las 10:16

Si quieres atrapar a los dos Exception y Error uso de instancias:

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

Ya que ambos Exception y Error extender Throwable.

Bueno, creo que estás usando JUnit para escribir tus pruebas. En ese caso, no debe atrapar su Assert.assertEquals() porque deberían pasar por la ejecución normal de la prueba. Si arroja alguna excepción, significa que su código no está funcionando como debería.

  • sí, mi código de aserción arroja una excepción. Pero quiero capturar todos los errores tales como afirmaciones o cualquier otro error por clase de Excepción. Cómo puedo hacerlo ?

    – Galet

    16 de abril de 2015 a las 10:28

  • no puedes AssertionError hereda de Error lo que significa try...catch no será capaz de manejarlos. Mira aquí docs.oracle.com/javase/7/docs/api/java/lang/AssertionError.html. Si de todos modos necesita atraparlos, vea la respuesta de SpaceCowboy.

    – Akash

    16 de abril de 2015 a las 10:33


  • @Aakash eso es incorrecto, esto funciona bien: try { throw new AssertionError(); } catch( AssertionError e){ System.out.println("ok");}

    – danyamachine

    21 de agosto de 2018 a las 19:37

  • @danyamachine como dije, nosotros debería no atrapar AssertionError o cualquier Error para esa materia. Los errores están ahí para decirle al desarrollador que ha ocurrido algo incorrecto y que el programa no debe continuar. Es una respuesta tardía, pero más vale tarde que nunca 🙂

    – Akash

    20 oct 2019 a las 16:18

Si desea detectar los errores de esa manera, necesita algo como lo siguiente:

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

Puede crear su propia clase de excepción y pasar el mensaje que desee.

¿Ha sido útil esta solución?