¿Está bien plantear una excepción incorporada, pero con un mensaje diferente, en Python?

StackOverflow https://stackoverflow.com/questions/2180577

Pregunta

¿Está bien criar un Excepción incorporada con un texto personalizado? o para criar un advertencia incorporada también con texto personalizado?

La documentación dice:

Exception ValueError: planteado cuando una operación o función incorporada recibe un argumento (...)

¿Está implícito que solamente ¿Las operaciones incorporadas deberían aumentar una excepción de ValueError?

En la práctica, entiendo que es seguro crear una clase de excepción que hereda de ValueError o excepción. ¿Pero está bien no hacer eso y aumentar directamente un ValueError ("texto personalizado")?

Dado que ValueError está incorporado, elevar un ValueError (con un texto personalizado) permite a los usuarios ver rápidamente qué tipo de problema está involucrado, en comparación con un tipo de excepción personalizada (algo como "ValueErrorsPecificModule", que no es estándar).

¿Fue útil?

Solución

No hay nada operacionalmente malo en hacer algo como:

raise ValueError("invalid input encoding")

De hecho, lo hago con bastante frecuencia cuando escribo el primer pase de algún código. El principal problema de hacerlo de esa manera es que los clientes de su código tienen dificultades para ser precisos en su manejo de excepciones; Para atrapar esa excepción específica, tendrían que hacer una coincidencia de cadenas en el objeto de excepción que capturaron, lo cual es obviamente frágil y tedioso. Por lo tanto, sería mejor introducir una subclase ValueError propia; Esto aún podría ser atrapado como ValueError, pero también como la clase de excepción más específica.

Una regla general es que siempre que tenga código como:

raise ValueError('some problem: %s' % value)

Probablemente debería reemplazarlo con algo como:

class SomeProblem(ValueError):
    """
    Raised to signal a problem with the specified value.
    """
# ...
raise SomeProblem(value)

Podría decir que el tipo de excepción especifica qué salió mal, mientras que el mensaje / atributos especifica cómo salió mal.

Otros consejos

Está bien y lo hago todo el tiempo. Me resulta menos sorprendente ver TypeError que MySpecialTypeError en muchas situaciones.

Sobre el Página que vinculó, No veo la frase "incorporada":

exception TypeError: Raised when an operation or function is applied to an object of inappropriate type. The associated value is a string giving details about the type mismatch.

Quizás alguien vio su pregunta y ya solucionó la documentación.
EDITAR: Parece que puede haber insertado la documentación para ValueError en vez de TypeError

Está perfectamente bien.

Sin embargo, es posible que desee crear su propia subclase para ayudar a distinguir de las excepciones creadas

Por ejemplo, si tienes algo que funciona como un dict, puede plantear un KeyError por las razones habituales, pero ¿qué pasa si el KeyError realmente proviene de un dict subyacente que está utilizando en la implementación?

La elevación de una subclase de KeyError hace que sea más fácil ver que hay un error en la implementación, y no que la clave simplemente no esté en su objeto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top