Manejo de múltiples excepciones en Python

Dado un fragmento de código que puede arrojar cualquiera de varias excepciones diferentes, es necesario tener en cuenta todas las posibles excepciones que podrían generarse sin crear código duplicado o pasajes de código largos y serpenteantes.

Si puede manejar diferentes excepciones, todas usando un solo bloque de código, se pueden agrupar en una tupla como se muestra en el código que se proporciona a continuación:

Código #1:

try:
    client_obj.get_url(url)
except (URLError, ValueError, SocketTimeout):
    client_obj.remove_url(url)

Se remove_url()llamará al método si se produce alguna de las excepciones enumeradas. Si, por otro lado, si una de las excepciones tiene que manejarse de manera diferente, colóquela en su propia cláusula excepto como se muestra en el código que se muestra a continuación:

Código #2:

try:
    client_obj.get_url(url)
except (URLError, ValueError):
    client_obj.remove_url(url)
except SocketTimeout:
    client_obj.handle_url_timeout(url)

Muchas excepciones se agrupan en una jerarquía de herencia. Para tales excepciones, todas las excepciones pueden capturarse simplemente especificando una clase base. Por ejemplo, en lugar de escribir código como se muestra en el siguiente código:

Código #3:

try:
    f = open(filename)
except (FileNotFoundError, PermissionError):
    ...

La declaración de excepción se puede reescribir como en el código que se proporciona a continuación. Esto funciona porque OSErrores una clase base que es común a las excepciones PermissionError FileNotFoundErrory PermissionError .

Código #4:

try:
    f = open(filename)
except OSError:
    ...

Aunque no es específico para manejar múltiples excepciones per se , vale la pena señalar que uno puede manejar la excepción lanzada usándolas como una palabra clave como se muestra en el código que se proporciona a continuación.

Código #5:

try:
    f = open(filename)
  
except OSError as e:
    if e.errno == errno.ENOENT:
        logger.error('File not found')
    elif e.errno == errno.EACCES:
        logger.error('Permission denied')
    else:
        logger.error('Unexpected error: % d', e.errno)

La variable e contiene una instancia del OSError generado. Esto es útil si la excepción debe invertirse más, como procesarla en función del valor del código de estado adicional. Las cláusulas de excepción se comprueban en el orden indicado y se ejecuta la primera coincidencia.

Código n.º 6: cree situaciones en las que coincidan varias cláusulas de excepción

f = open('missing')

Producción :

Traceback (most recent call last):
File "", line 1, in 
FileNotFoundError: [Errno 2] No such file or directory: 'miss
try:
    f = open('missing')
    except OSError:
        print('It failed')
    except FileNotFoundError:
        print('File not found')

Producción :

Failed

Aquí, la FileNotFoundError cláusula de excepción no se ejecuta porque OSErrores más general, coincide con la excepción FileNotFoundError y aparece en primer lugar.

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 *