Todos Throwable
s excepto las subclases de java.lang.RuntimeException
o java.lang.Error
están marcados. Correctamente, en Java, "excepciones" son subclases de java.lang.Exception
, "errores" son subclases de java.lang.Error
y java.lang.Throwable
generalmente no se subclasifican directamente. No se supone
Programas para crear sus propios Error
subclases (aunque la documentación es bastante ambiguo en eso) por lo general siempre se crea Exceptions
, usando un RuntimeException
si no desea que se comprueba.
Para conocer en tiempo de ejecución si tiene una marcada excepción puede usar:
if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) {
// this is a checked Exception
}
Una excepción comprobada es uno que debe ser manejada de una cláusula catch, o declarado como ser lanzado en la firma del método; el compilador hace cumplir esto. Generalmente, uno usa excepciones marcadas para excepciones que deben ser manejadas por el código de llamada, mientras que las excepciones no revisadas son para condiciones que son el resultado de un error de programación y se deben corregir corrigiendo el código.
Dicho esto, hay mucho debate en la comunidad Java acerca de la eficacia del uso de excepciones comprobadas frente a excepciones sin marcar en todas partes, un tema muy profundo para analizar en esta respuesta.
EDITAR 10/23/2012: En respuesta a los comentarios (que son bastante válida), para aclarar, lo siguiente sería lo que se requiere para determinar si un capturado Throwable
es una comprobado Throwable
en contraposición a una marcada Exception
:
if(obj instanceof Throwable && !(obj instanceof RuntimeException) && !(obj instanceof Error)) {
// this is a checked Throwable - i.e. Throwable, but not RuntimeException or Error
}
Si el objeto en cuestión se conoce para que sea una instancia de Throwable
(p. fue capturado), solo se necesita la segunda parte del 'si' anterior (por ejemplo, la prueba de Throwable es redundante).
Esto omite las excepciones que heredan de 'Throwable' pero no de' Exception', que se verifican. Generalmente tiene: Una 'excepción' no comprobada t satisfará: 't instanceof Error || t instanceof Exception' Se comprueba todo lo demás que es 'instanceof Throwable'. Un error es un tipo de excepción en el sentido general. – BeeOnRope
@Bee: En cierto sentido eso es bastante correcto; pero, 'Error's son *** Errores ***, no *** Excepciones ***, y Java hace la distinción al nombrar (el manejo 'Error' es otro caso donde la teoría falla en la práctica, pero, pensé, una discusión relacionada pero separada). Es decir, los "errores" también se verifican, pero en la nomenclatura de Java son errores, no excepciones; Sin embargo, tanto los errores como las excepciones son 'Throwable's. Según Java, un 'Error' es un' Throwable' pero no una 'Exception' (más generalmente en inglés,' Error's son "excepciones", pero no son "Exceptions"). –
Exactamente. Dicho esto, supondría que un método que decidiera si un throwable era un check o no sería verdadero para todas las excepciones marcadas, no solo para las excepciones marcadas.Es decir, tomaría el pequeño sentido de la palabra. No puedo ver un caso de uso válido para excluir elementos que extienden 'Throwable' pero no' Exception' o 'Error'. ¿Cómo llamas a esos de todos modos? – BeeOnRope