¿Debo especificar siempre un tipo de excepción en las declaraciones "excepto"?

Resuelto HorseloverFat asked hace 11 años • 7 respuestas

Cuando se utiliza PyCharm IDE, el uso de except:sin un tipo de excepción activa un recordatorio del IDE de que esta cláusula de excepción es Too broad.

¿Debería ignorar este consejo? ¿O es Pythonic especificar siempre el tipo de excepción?

HorseloverFat avatar Feb 10 '13 18:02 HorseloverFat
Aceptado

Casi siempre es mejor especificar un tipo de excepción explícito. Si utiliza una except:cláusula simple, podría terminar detectando excepciones distintas a las que espera detectar; esto puede ocultar errores o dificultar la depuración de programas cuando no están haciendo lo que espera.

Por ejemplo, si está insertando una fila en una base de datos, es posible que desee detectar una excepción que indique que la fila ya existe, para poder realizar una actualización.

try:
    insert(connection, data)
except:
    update(connection, data)

Si especifica bare except:, también detectará un error de socket que indica que el servidor de la base de datos se ha caído. Es mejor detectar únicamente excepciones que sepa cómo manejar; a menudo es mejor que el programa falle en el punto de la excepción que continuar pero comportarse de maneras extrañas e inesperadas.

Un caso en el que es posible que desee utilizar un programa básico except:es en el nivel superior de un programa que debe estar siempre ejecutándose, como un servidor de red. Pero luego, debes tener mucho cuidado al registrar las excepciones; de lo contrario, será imposible determinar qué está fallando. Básicamente, sólo debería haber como máximo un lugar en un programa que haga esto.

Un corolario de todo esto es que su código nunca debería funcionar raise Exception('some message')porque obliga a usar el código del cliente except:(o except Exception:lo cual es casi tan malo). Debe definir una excepción específica para el problema que desea señalar (tal vez heredando de alguna subclase de excepción incorporada como ValueErroro TypeError). O debería generar una excepción incorporada específica. Esto permite a los usuarios de su código tener cuidado al detectar solo las excepciones que desean manejar.

babbageclunk avatar Feb 10 '2013 12:02 babbageclunk

No debes estar ignorando los consejos que te da el intérprete.

De la Guía de estilo PEP-8 para Python:

Al detectar excepciones, mencione excepciones específicas siempre que sea posible en lugar de utilizar una cláusula excepto: simple.

Por ejemplo, utilice:

 try:
     import platform_specific_module 
 except ImportError:
     platform_specific_module = None 

Una cláusula simple except: detectará las excepciones SystemExit y KeyboardInterrupt, lo que hará más difícil interrumpir un programa con Control-C y puede disfrazar otros problemas. Si desea detectar todas las excepciones que indican errores del programa, utilice excepto Excepción: (excepto simple es equivalente a excepto BaseException:).

Una buena regla general es limitar el uso de cláusulas 'excepto' simples a dos casos:

Si el controlador de excepciones imprimirá o registrará el rastreo; al menos el usuario será consciente de que se ha producido un error. Si el código necesita realizar algún trabajo de limpieza, pero luego permite que la excepción se propague hacia arriba con el aumento. Inténtelo... finalmente puede ser una mejor manera de manejar este caso.

asheeshr avatar Feb 10 '2013 11:02 asheeshr