java - tipos - ¿Cuándo se debe usar Throwable en lugar de Excepción nueva?
tipos de excepciones en java netbeans (11)
(de los comentarios). El problema que planteó esto es que necesito pasar una ''excepción'' a un fragmento de código que un compañero de trabajo está creando si no se genera una colección.
En ese caso, es posible que desee lanzar una excepción marcada . Puede lanzar una Exception
, una subclase existente adecuada de la misma (excepto RuntimeException
y sus subclases que no están marcadas ) o una subclase de Exception
(por ejemplo, " CollectionBuildException
"). Consulte el Tutorial de Java sobre excepciones para ponerse al día con las excepciones de Java.
Given: Throwable
es la superclase de Exception
.
Cuando leo textos sobre cómo escribir sus propias ''excepciones'', veo ejemplos de Throwable
se usa en el bloque catch
y otros textos muestran new Exception()
se usan en el bloque catch
. Todavía tengo que ver una explicación de cuándo uno debería usar cada uno.
Mi pregunta es: ¿cuándo se debe usar Throwable
y cuándo se debe usar new Exception()
?
Dentro de la catch
o else
bloquea usando cualquiera de los siguientes:
throw throwable;
o
throw new Exception();
Como lo escuché cuando salió Java por primera vez, la teoría era que Throwable podría usarse para la transferencia de control en otros casos además de las excepciones. Nunca lo había visto usado de esa manera (y eso es probablemente una muy buena cosa).
Así que solo atrapa Exception (o mejor aún, una excepción más refinada).
No debe usar Excepciones como un "tipo de devolución" tampoco ...
Si la condición que está lanzando es común, está gastando una gran cantidad de recursos para devolver esa condición a la rutina de llamadas. Las excepciones son caras de construir.
He visto casos en los que los bucles ajustados arrojaban excepciones como "negativas" para, por ejemplo, la asignación de ID, esta rutina ocupaba aproximadamente el 99% del tiempo de la CPU. Cuando se cambiaba a una constante de retorno documentada, esta disminuía al 25%.
Por lo general, no lanzarás ni atraparás Throwable. En particular, los errores de JVM (que extienden Error ()) no están destinados a ser capturados por el código de usuario a menos que esté haciendo un trabajo de nivel de sistema extraño.
Trate "Throwable" como un artefacto de lenguaje. La clase "Excepción" se llama así porque es la que está destinada a ser utilizada por los programadores cuando quieren que un bloque de código salga "excepcionalmente", al no salir normalmente o devolver un valor.
Eso incluye situaciones de error regulares (me refiero a errores "normales" en oposición a JVM) y lugares donde está utilizando excepciones como mecanismo de control.
Realmente no debería atrapar una excepción y lanzar una nueva tan general como "nueva excepción".
En cambio, si desea hacer una excepción, simplemente haga lo siguiente:
try {
// Do some stuff here
}
catch (DivideByZeroException e) {
System.out.println("Can''t divide by Zero!");
}
catch (IndexOutOfRangeException e) {
// catch the exception
System.out.println("No matching element found.");
}
catch (Throwable e) {
throw e; // rethrow the exception/error that occurred
}
Creo que no es una buena práctica atrapar una excepción y lanzar una nueva excepción en lugar de la que se planteó a su bloque de código, a menos que genere una excepción personalizada útil que proporcione suficiente contexto para eludir la causa de la excepción original. .
Siempre arroje una Exception
(nunca es Throwable
). Generalmente no atrapas a Throwable
tampoco, pero puedes. Throwable es la superclase de Exception
and Error
, por lo que verás Throwable
si no solo quieres capturar Exception
s pero Error
s, ese es el sentido de tenerla. El hecho es que los Error
generalmente son cosas que una aplicación normal no debería capturar, así que simplemente use Exception
menos que tenga una razón específica para usar Throwable
.
Solo en dos lugares debería ver la palabra Throwable
en el código:
public static void main(String args[])
{
try
{
// Do some stuff
}
catch(Throwable t)
{
}
}
Y
public class SomeServlet extends HttpServlet
{
public void doPost(HttpRequest request, HttpResponse response)
{
try
{
// Do some stuff
}
catch (Throwable t)
{
// Log
}
}
}
Throwable está destinado a ser capturado solo por el contenedor o el ciclo principal de tu programa. La mayoría de las veces, detectar cosas debajo de Exception, por ejemplo, Error, no agrega mucha capacidad a un programa, después de todo, ¿qué se puede hacer si se lanzan otros errores de VirtualError? No mucho, excepto registrar y continuar.
Todas las excepciones son un problema al final ... también dicen que los errores son errores no significan nada.
Los errores no son errores: son problemas que experimenta la máquina virtual anfitriona, por ejemplo, OutOfMemoryError. Las excepciones son un medio que la operación actual puede utilizar para notificar que falló y tal vez proporcionar algún diagnóstico.
throw new Exception();
es algo que nunca deberías hacer en un bloque de catch, pero es posible que tengas que hacerlo o quieras lanzar una new SomeException(throwable);
(preservando el rastro completo de la pila) en lugar de throw throwable;
para ajustarse a la API de su método, por ejemplo, cuando declara lanzar SomeException
pero está llamando al código que podría lanzar una IOException
que no desea agregar a la cláusula throws
su método.
El caso probablemente más común es la new RuntimeException(throwable);
para evitar tener una cláusula throws
por completo. Mucha gente te dirá que es un abuso horrible porque deberías estar usando excepciones marcadas. OMI están equivocados y las excepciones comprobadas son un error en el diseño del lenguaje Java que solo da como resultado un código feo e inmanejable.
Throwable es una interfaz, no una clase. Dos clases extienden Throwable, Exception y Error.
La regla es: sea lo más específico posible cuando capture excepciones; eso significa, por ejemplo, capturar excepciones en lugar de Throwable, e IOException en lugar de Exception.
No capte errores: los errores son errores. Corrige el código en su lugar.
Si tiene que atrapar absolutamente todo, use "atrapar Throwable", pero esta es una mala forma.