¿Cuándo debería subclasificar una excepción en Python?

10

En mi código hay unos siete lugares donde planteo una excepción. Todas estas excepciones se tratan de la misma manera: imprime un error en el archivo de registro, devuelve el estado del software al predeterminado y sal.

Durante la revisión del código, mi ingeniero senior, a quien valoro mucho, dijo que debería subclasificar todas estas excepciones. Su argumento es que en el futuro podríamos querer manejar las excepciones de manera diferente y eso será más fácil.

Mi argumento es que actualmente solo saturará nuestro código y, dado que no sabemos si alguna vez manejaremos las excepciones de manera diferente, deberíamos dejar el código conciso y, si llega el momento, entonces y solo entonces deberíamos subtipo .

Me gustaría escuchar cualquier argumento para cada caso.

Ezra
fuente
2
YAGNI ... No lo necesitas ahora y siempre puedes agregarlo más tarde sin demasiada dificultad.
Robert Harvey
¿Tienes algún ejemplo? ¿Solo está generando Exception, por ejemplo, o errores integrados más específicos?
jonrsharpe
simplemente planteando una excepción ("descripción específica")
Ezra
@Ezra al menos, debería ver si hay una excepción incorporada más adecuada (ver docs.python.org/2/library/exceptions.html ).
jonrsharpe

Respuestas:

8

Tienes razón

Robert Harvey ya menciona el argumento de su lado: no agregue el código que no necesita en este momento, especialmente porque es fácil agregarlo más tarde.

Tu crítico también tiene razón

Por otro lado, el punto del revisor también es comprensible:

  • Devolver un genérico Exception()no es muy útil para la persona que llama: mientras que la descripción de la excepción indica a un humano lo que está sucediendo, tratar excepciones de manera diferente mediante programación puede ser imposible. El desarrollador que usa su código puede ser reacio a cambiar los tipos de excepciones , incluso por miedo (justificado o no) a romper algo.

    Tenga en cuenta que agregar excepciones personalizadas en este momento no es tan difícil :

    class MyCustomException(Exception):
        pass

    es todo lo que necesitas. Eso es solo dos líneas de código (dado que es posible que ni siquiera necesite crear un archivo separado si coloca excepciones personalizadas en un archivo).

  • El código en sí se ve mejor, más legible.

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")

    parece un poco más legible en comparación con:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")

    debido a la indicación del tipo de excepción:

    • En la segunda parte del código, necesito leer la descripción y adivinar que el precio está fuera de rango (¿o tal vez no? ¿Tal vez hay casos en los que el precio puede ser negativo, como los reembolsos?)

    • En la primera parte del código, un vistazo sobre el tipo da una indicación inmediata sobre el error. Parece que hay un conjunto de valores permitidos para un precio, y el valor actual está fuera de este conjunto.

¿Entonces?

Entonces:

  • Ambos enfoques son válidos. Si no subclasifica las excepciones cuando no necesita tipos personalizados, tiene razón. Cuando subclases las excepciones porque no cuesta nada hacerlo y puede ser útil más adelante, tienes razón.

  • Sea consistente con su equipo. Si su equipo usa excepciones personalizadas ampliamente, úselas.

Arseni Mourzenko
fuente
2
Pero hay un término medio: raise ValueError('The price is less than zero'). Esto es más específico que la base Exception, pero sin ningún problema.
jonrsharpe
+1 para la simple afirmación "sé consistente", con un equipo si tienes uno, contigo mismo si no lo tienes.
Styne666