retornar practices practice management custom create best java exception-handling class-design

practices - ¿Por qué es java.lang.Throwable una clase?



throw custom exception java (4)

Entonces, ¿por qué Throwable es una clase?

Puedo pensar en dos razones:

  1. Las excepciones tienen estado. En particular, mensaje, causa y seguimiento de la pila.
  2. Es más fácil para la JVM implementar bloques de captura eficientes. Las verificaciones de jerarquía de clase son más baratas que las comprobaciones de interfaz.

¿No sería más fácil manejar las excepciones si Throwable fuera una interfaz?

El manejo de excepciones es un tema difícil, independientemente de si las excepciones son clases o interfaces. De hecho, sospecho que dificultaría a los programadores de Java si tuvieran que ordenar sus bloques de captura basándose en interfaces arbitrarias en lugar de jerarquías de clase.

¿Pero podría hacerse abstracto?

En teoría, sí. En la práctica, no. Demasiado código depende de poder crear una instancia de Throwable para llamar a getStackTrace.

En Java, los adjetivos que terminan en -able son interfaces Serializable , Comparable , etc. Entonces, ¿por qué Throwable es una clase? ¿No sería más fácil manejar las excepciones si Throwable fuera una interfaz? (Editar: por ejemplo, las clases de excepción no necesitan extender Exception / RuntimeException).

Obviamente, cambiarlo ahora está fuera de cuestión. ¿Pero podría hacerse abstracto? ¿No evitaría eso la mala práctica de throw new Throwable() ;


¡bien Hashtable también es una clase concreta! Algo que puede ser hashted.

y que es Cloneable? no es una palabra correcta en inglés.


Así es como James Gosling explicó su decisión:

Programa de conexión de desarrolladores de Java : ¿por qué Throwable no es una interfaz? El nombre del tipo sugiere que debería haber sido. Poder catch tipos, es decir, algo así como try {} catch (<some interface or class>) , en lugar de solo clases. Eso haría [el] Java [lenguaje de programación] mucho más flexible.

James Gosling : La razón por la que Throwable y el resto de esos tipos no son interfaces es porque decidimos, o lo decidí desde el principio. Decidí que quería tener un estado asociado con cada excepción que se lanza. Y no puedes hacer eso con interfaces; solo puedes hacer eso con las clases. El estado que está allí es básicamente estándar. Hay un mensaje, hay una instantánea, cosas así, eso siempre está ahí. y también, si haces de Throwable una interfaz, la tentación es asignar, para hacer que cualquier objeto viejo sea algo que se pueda Throwable . Se siente estilísticamente que arrojar objetos generales es probablemente una mala idea, que las cosas que quieres arrojar realmente deberían ser cosas que pretenden ser excepciones que realmente capturan la naturaleza de la excepción y lo que sucedió. No son solo estructuras de datos generales.

Referencias


FYI

No puede utilizar

void doSomething() throws Serializable

¡pero puedes usar genéricos!

<T extends Exception & Serializable> doSomething() throws T

Saludos