¿Se considera lo anterior como una excepción marcada? No El hecho de que esté manejando una excepción no lo convierte en un Checked Exception
si es un RuntimeException
.
Es RuntimeException
un unchecked exception
? si
Checked Exceptions
son subclasses
de java.lang.Exception
Unchecked Exceptions
son subclasses
dejava.lang.RuntimeException
Las llamadas que arrojan excepciones comprobadas deben incluirse en un bloque try {} o manejarse en un nivel superior en la persona que llama del método. En ese caso, el método actual debe declarar que arroja dichas excepciones para que los llamantes puedan hacer los arreglos apropiados para manejar la excepción.
Espero que esto ayude.
P: ¿debo hacer burbujear la excepción exacta o enmascararla usando Exception?
R: Sí, esta es una muy buena pregunta y una importante consideración de diseño. La clase Exception es una clase de excepción muy general y se puede usar para ajustar excepciones internas de bajo nivel. Será mejor que crees una excepción personalizada y la envuelvas dentro. Pero, y uno grande: nunca oculte la causa raíz original subyacente. Por ejemplo, Don't ever
haz lo siguiente:
try {
attemptLogin(userCredentials);
} catch (SQLException sqle) {
throw new LoginFailureException("Cannot login!!"); //<-- Eat away original root cause, thus obscuring underlying problem.
}
En su lugar, haga lo siguiente:
try {
attemptLogin(userCredentials);
} catch (SQLException sqle) {
throw new LoginFailureException(sqle); //<-- Wrap original exception to pass on root cause upstairs!.
}
La eliminación de la causa raíz original entierra la causa real más allá de la recuperación es una pesadilla para los equipos de soporte de producción, a los que solo tienen acceso los registros de aplicaciones y los mensajes de error. Aunque este último es un mejor diseño, muchas personas no lo usan a menudo porque los desarrolladores simplemente no transmiten el mensaje subyacente a la persona que llama. Por lo tanto, tome una nota firme: Always pass on the actual exception
retroceda si está envuelto o no en una excepción específica de la aplicación.
Al intentar atrapar RuntimeExceptions
RuntimeException
s como regla general no debe ser probado. Generalmente señalan un error de programación y deben dejarse solos. En cambio, el programador debe verificar la condición de error antes de invocar algún código que pueda resultar en un RuntimeException
. Por ej .:
try {
setStatusMessage("Hello Mr. " + userObject.getName() + ", Welcome to my site!);
} catch (NullPointerException npe) {
sendError("Sorry, your userObject was null. Please contact customer care.");
}
Esta es una mala práctica de programación. En cambio, un cheque nulo debería haberse hecho como:
if (userObject != null) {
setStatusMessage("Hello Mr. " + userObject.getName() + ", Welome to my site!);
} else {
sendError("Sorry, your userObject was null. Please contact customer care.");
}
Pero hay momentos en que dicha comprobación de errores es costosa, como el formato de números, considere esto:
try {
String userAge = (String)request.getParameter("age");
userObject.setAge(Integer.parseInt(strUserAge));
} catch (NumberFormatException npe) {
sendError("Sorry, Age is supposed to be an Integer. Please try again.");
}
Aquí la comprobación de errores previa a la invocación no vale la pena porque esencialmente significa duplicar todo el código de conversión de cadena a entero dentro del método parseInt (), y es propenso a errores si lo implementa un desarrollador. Por lo tanto, es mejor eliminar el try-catch.
Entonces, NullPointerException
y NumberFormatException
ambos son RuntimeExceptions
, la captura de un NullPointerException
debería reemplazarse con una elegante comprobación nula, mientras que recomiendo capturar NumberFormatException
explícitamente para evitar la posible introducción de código propenso a errores.
DataSeries
clase que contiene datos que siempre deben permanecer en orden basado en el tiempo. Hay un método para agregar un nuevoDataPoint
al final de aDataSeries
. Si todo mi código funciona correctamente durante todo el proyecto,DataPoint
nunca se debe agregar un al final que tenga una fecha anterior a la que ya está al final. Cada módulo en todo el proyecto está construido con esta verdad. Sin embargo, verifico esta condición y lanzo una excepción no marcada si sucede. ¿Por qué? Si sucede, quiero saber quién está haciendo esto y solucionarlo.