La captura de todas las excepciones a veces se usa como una muleta por parte de los programadores que no pueden recordar todas las posibles excepciones que pueden ocurrir en operaciones complicadas. Como tal, también es una muy buena manera de escribir código no depurable.
Debido a esto, si uno detecta todas las excepciones, es absolutamente fundamental registrar o informar el motivo real de la excepción en algún lugar (por ejemplo, archivo de registro, mensaje de error impreso en la pantalla, etc.).
Problema: código que detecta todas las excepciones
Código n.º 1: escribir un controlador de excepciones para que Exception capture todas las excepciones.
try: ... except Exception as e: ... # Important log('Reason:', e)
Esto detectará todas las excepciones excepto SystemExit
, KeyboardInterrupt
y GeneratorExit
.
Código #2: Considerando el ejemplo.
def parse_int(s): try: n = int(v) except Exception: print("Couldn't parse")
Código #3: Usando la función anterior
print (parse_int('n / a'), "\n") print (parse_int('42'))
Producción :
Couldn't parse Couldn't parse
En este punto, surge la pregunta de cómo no funciona. Ahora bien, si la función se hubiera escrito como:
Código #4:
def parse_int(s): try: n = int(v) except Exception as e: print("Couldn't parse") print('Reason:', e)
En este caso, se recibirá la siguiente salida, que indica que se ha cometido un error de programación.
parse_int('42')
Producción :
Couldn't parse Reason: global name 'v' is not defined
Problema: envolver excepciones de nivel inferior con excepciones personalizadas que tienen más significado en el contexto de la aplicación (una está trabajando).
Para crear nuevas excepciones simplemente defínalas como clases que heredan de Exception (o uno de los otros tipos de excepción existentes si tiene más sentido).
Código #5: Definición de algunas excepciones personalizadas
class NetworkError(Exception): pass class HostnameError(NetworkError): pass class TimeoutError(NetworkError): pass class ProtocolError(NetworkError): pass
Código #6: Usando estas excepciones de la manera normal.
try: msg = s.recv() except TimeoutError as e: ... except ProtocolError as e: ...
- Las clases de excepción personalizadas casi siempre deben heredar de la clase de excepción integrada, o heredar de alguna excepción base definida localmente que a su vez herede de Exception.
- BaseException está reservado para las excepciones de salida del sistema, como KeyboardInterrupt o SystemExit, y otras excepciones que deberían señalar la salida de la aplicación. Por lo tanto, capturar estas excepciones no es el caso de uso previsto.
Publicación traducida automáticamente
Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA