Python | Atrapar y crear excepciones

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, KeyboardInterrupty 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *