java - tengo - ¿Está bien intentar capturar algo solo para verificar si se lanzó una excepción o no?
como se captura una imagen en la computadora (10)
Debe tener en cuenta que la construcción del objeto Exception es costosa en términos de tiempo y recursos para la JVM, ya que debe construir la traza del strack.
Entonces, lo que usted propone es una manera fácil pero que consume muchos recursos para resolver el problema.
Por lo tanto, si esta solución es aceptable o no depende del uso que le va a dar a esta función y sus requisitos de eficiencia.
¿Es una buena manera de probar algo inútil solo para ver si el código arroja una excepción en particular?
Quiero hacer algo cuando se lanza la excepción, y nada de lo contrario.
try {
new BigDecimal("some string"); // This do nothing because the instance is ignored
} catch (NumberFormatException e) {
return false; // OK, the string wasn''t a well-formed decimal
}
return true;
Hay demasiadas precondiciones para probar, y el constructor BigDecimal () siempre las está revisando todas, por lo que este parece ser el método más simple.
El rendimiento puede no ser excelente y la sintaxis es prolija, pero el código es muy preciso sobre lo que hace. No hay duplicación entre el cheque y el uso, lo cual siempre es una gran preocupación.
(Tenga en cuenta que este tipo particular de conversión hacia y desde cadenas es realmente para la depuración y la configuración interna. No maneja configuraciones regionales y otras consideraciones orientadas al ser humano. El uso en formatos de archivos y protocolos cableados introduce una fuerte dependencia de la representación utilizada por clase.)
En general, esta práctica debe evitarse. Pero como no hay un método de utilidad es isValidBigDecimal(..)
, ese es el camino a seguir.
Como señaló Peter Tillemans en los comentarios, coloque este código en un método de utilidad llamado isValidBigDecimal(..)
. Por lo tanto, su código será independiente de la forma de determinar la validez, e incluso más adelante podrá cambiar a otro método.
Boris Pavlović sugirió una opción para verificar que usando una biblioteca de terceros (commons-lang). Hay un método más útil allí, que uso cada vez que necesito verificar números: NumberUtils.isNumber(..)
Hay dos métodos conocidos para "verificar" las condiciones previas.
LBYL: mira antes de saltar
Este estilo de codificación prueba explícitamente las condiciones previas antes de realizar llamadas o búsquedas. Este estilo contrasta con el enfoque EAFP y se caracteriza por la presencia de muchas declaraciones if.
EAFP: es más fácil pedir perdón que permiso.
Este estilo de codificación común asume la existencia de claves o atributos válidos y atrapa excepciones si la suposición es falsa. Este estilo limpio y rápido se caracteriza por la presencia de muchas instrucciones try y except. La técnica contrasta con el estilo LBYL común en muchos otros lenguajes, como C.
EAFP siempre es una buena idea para el lenguaje que tiene tipado pato.
Claramente depende de lo que quiera hacer ... Si no está seguro del tipo de objeto que manipular, use EAFP.
Los bloques Try / Catch nunca deben usarse para lógica.
No hay nada de malo en hacer esto; después de todo, los defensores de otro idioma entienden que "es más fácil disculparse que pedir permiso", es decir, es más fácil esperar a que algo falle y lidiar con ello que evitar el fracaso por completo. En este caso, dado que no hay alternativa, apúrate.
Sí, esto ciertamente está en disputa con la noción de "Excepciones excepcionales para casos excepcionales" del programador pragmático, pero reconoces lo que estás haciendo para que no haya ningún problema.
Seguro Por qué no. Esto es lo que hacemos para verificar si una dirección de correo electrónico especificada por el cliente está formateada correctamente:
try
{
MailMessage m = new MailMessage(from, to, subject, body);
return true;
}
catch(SmtpFailedRecipientsException ex)
{
return false;
}
Ahora, las personas pueden discutir sobre el rendimiento o la adecuación de la estructura, pero olvidan las ventajas y desventajas de la simplicidad:
- El código anterior atrapará los formatos de datos EXACT aceptados por .NET. Cualquiera que haya analizado las direcciones de correo electrónico sabrá que hay una gran cantidad de discrepancias sobre lo que se considera una estructura de dirección de correo electrónico con el formato correcto. Este código garantiza validar las estructuras de las direcciones de correo electrónico de la manera que le gusta a .NET, no de la manera que creo que debería ser.
- La excepción atrapa múltiples casos de uso, no solo la corrección de una estructura de datos básica. Validará múltiples usuarios en los campos CC, BCC y TO, lo que se volverá difícil de manejar con el código escrito a mano.
Como otros comentan arriba, este código se abstrae mejor en una clase de utilidad separada en lugar de mezclarse con su código principal.
Si no le gusta tener un método como este, intente utilizar BigDecimalValidator
de Apache Commons Validator . En caso de una String
entrada no válida, devuelve null
.
Un comentario sobre la respuesta de Kriss: no veo una "excelente fuga de memoria" aquí. No hay referencia al BigDecimal creado. Tan pronto como este método se complete y salgamos del alcance, el objeto es elegible para la recolección de basura.
Las pérdidas de memoria ocurren cuando tenemos referencias que ya no necesitamos para que el objeto no pueda ser recogido.