¿Por qué los bloques de captura vacíos son una mala idea? [cerrado]
Acabo de ver una pregunta sobre try-catch , ¿qué personas (incluido Jon Skeet) dicen que los bloques catch vacíos son una muy mala idea? ¿Por qué esto? ¿No existe ninguna situación en la que un cierre vacío no sea una decisión de diseño incorrecta?
Quiero decir, por ejemplo, a veces quieres obtener información adicional de algún lugar (servicio web, base de datos) y realmente no te importa si obtendrás esta información o no. Así que intenta obtenerlo, y si pasa algo, está bien, simplemente agregaré un "captura (excepción ignorada) {}" y eso es todo.
Por lo general, el try-catch vacío es una mala idea porque estás tragando silenciosamente una condición de error y luego continúas con la ejecución. En ocasiones, esto puede ser lo correcto, pero a menudo es una señal de que un desarrollador vio una excepción, no supo qué hacer al respecto y, por lo tanto, utilizó un mensaje vacío para silenciar el problema.
Es el equivalente en programación a poner cinta negra sobre una luz de advertencia del motor.
Creo que la forma de abordar las excepciones depende de en qué capa del software esté trabajando: Excepciones en la selva tropical .
Son una mala idea en general porque es una condición verdaderamente rara en la que una falla (condición excepcional, de manera más genérica) se resuelve adecuadamente sin respuesta alguna. Además de eso, catch
los bloques vacíos son una herramienta común utilizada por las personas que usan el motor de excepciones para verificar errores que deberían hacer de manera preventiva.
Decir que siempre es malo es falso... eso es cierto para muy pocas cosas. Puede haber circunstancias en las que no le importe que haya habido un error o que la presencia del error de alguna manera indique que no puede hacer nada al respecto de todos modos (por ejemplo, cuando escribe un error anterior en un archivo de registro de texto y obtienes un IOException
, lo que significa que no pudiste escribir el nuevo error de todos modos).
No me extendería tanto como para decir que quien usa bloques catch vacíos es un mal programador y no sabe lo que está haciendo...
Utilizo bloques catch vacíos si es necesario. A veces, el programador de la biblioteca que estoy consumiendo no sabe lo que está haciendo y lanza excepciones incluso en situaciones en las que nadie las necesita.
Por ejemplo, considere alguna biblioteca de servidor http, no me importa si el servidor arroja una excepción porque el cliente se ha desconectado y index.html
no se ha podido enviar.
Sólo se deben lanzar excepciones si realmente hay una excepción: algo que sucede más allá de la norma. Un bloque catch vacío básicamente dice "algo malo está sucediendo, pero no me importa". Esta es una mala idea.
Si no desea manejar la excepción, deje que se propague hacia arriba hasta que alcance algún código que pueda manejarla. Si nada puede manejar la excepción, debería eliminar la aplicación.
Creo que está bien si detecta un tipo de excepción en particular y sabe que solo se generará por una razón en particular , y espera esa excepción y realmente no necesita hacer nada al respecto.
Pero incluso en ese caso, podría ser necesario enviar un mensaje de depuración.