¿Capturas una excepción genérica en Java?

Usamos JUnit 3 en el trabajo y no hay anotación ExpectedException . Quería agregar una utilidad a nuestro código para ajustar esto:

  try { someCode(); fail("some error message"); } catch (SomeSpecificExceptionType ex) { } 

Así que probé esto:

 public static class ExpectedExceptionUtility { public static  void checkForExpectedException(String message, ExpectedExceptionBlock block) { try { block.exceptionThrowingCode(); fail(message); } catch (T ex) { } } } 

Sin embargo, Java no puede usar tipos de excepción generics en un bloque catch, creo.

¿Cómo puedo hacer algo como esto, trabajando en torno a la limitación de Java?

¿Hay alguna manera de verificar que la variable ex sea ​​de tipo T ?

Podría pasar el objeto Class y verificarlo programáticamente.

 public static  void checkForException(String message, Class exceptionType, ExpectedExceptionBlock block) { try { block.exceptionThrowingCode(); } catch (Exception ex) { if ( exceptionType.isInstance(ex) ) { return; } else { throw ex; //optional? } } fail(message); } //... checkForException("Expected an NPE", NullPointerException.class, //... 

No estoy seguro de si querrías el reestreno o no; reiniciar fallaría / error igualmente la prueba, pero semánticamente no lo haría, ya que básicamente significa “no obtuvimos la excepción que esperábamos” y eso representa un error de progtwigción, en lugar de un error en el entorno de prueba.

Entiendo el impulso de tratar de simplificar su lenguaje de prueba de excepción, pero en serio: no lo haga. Cada posible elección que se te ocurra es una cura peor que la enfermedad. ¡Especialmente la tontería de @ExpectedException de JUnit 4! Es una solución framework demasiado inteligente, que requiere que todos aprendan cómo funciona, a diferencia de un simple código evidente de código Java normal. Peor aún, no le da ninguna forma de ajustar solo la parte de su prueba que espera arrojar la excepción, por lo que si un paso de configuración anterior arroja la misma excepción, su prueba pasará aunque su código esté roto.

Podría escribir una larga diatriba sobre esto aquí (lo siento por no tener suficiente tiempo), ya que hemos tenido una larga discusión de este problema entre los ingenieros de Java aquí en Google, y el consenso fue que ninguna de estas soluciones locas valen la pena Acostumbrarse a probar / atrapar, realmente no es tan malo.

Los generics no son tipos. No son plantillas. Son comprobaciones de tipo de tiempo de comstackción, en Java. Los bloques de excepciones detectan el tipo. Puede atrapar (Excepción e) o incluso atrapar (Lanzable e) y luego lanzarlo según sea necesario.

Bueno, podrías coger Exception y Rethrow si no es una excepción esperada. Aunque la buena práctica de encoding generalmente dicta que la ruta de éxito del código no debe definirse por una excepción, entonces es posible que desee reconsiderar su diseño.

También puede usar un IDE que admita la plantilla en vivo (como IntellJ IDEA por ejemplo ) y asignar un acceso directo como ee -> [tab] que inserta el try / catch / ignore para su y le permite escribir el correcto.

como este http://img80.imageshack.us/img80/433/capturadepantalla201006j.png

como este http://img641.imageshack.us/img641/6733/capturadepantalla201006w.png

La cláusula de captura con parámetro de tipo no es posible:
http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#cannotCatch