2010-02-01 12 views
20

¿Está bien plantear un built-in exception con un texto personalizado? o para levantar un built-in warning también con texto personalizado?¿Está bien plantear una excepción incorporada, pero con un mensaje diferente, en Python?

La documentación lee:

exception ValueError: Raised when a built-in operation or function receives an argument (…)

¿Está implícito que sólo operaciones incorporadas deben plantear una excepción ValueError?

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

Dado que ValueError está incorporado, al generar un ValueError (con un texto personalizado) los usuarios pueden ver rápidamente qué tipo de problema está involucrado, en comparación con un tipo de excepción personalizado (algo así como "ValueErrorSpecificModule", que no es estándar) .

+2

Asegúrese de respetar la jerarquía de excepciones. Es poco probable, si está considerando una excepción estándar como 'TypeError', que la subclase' Exception' sea una buena alternativa. La subclasificación de 'StandardError' quizás ...' importa excepciones como e; ayuda (e) 'muestra el árbol. –

Respuesta

21

No hay nada operacionalmente malo en hacer algo como:

raise ValueError("invalid input encoding") 

De hecho, lo hago muy a menudo cuando Estoy escribiendo el primer pase de un código. El principal problema al 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 capturarse como ValueError, pero también como la clase de excepción más específica.

Una regla general es que cada vez que tenga un 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) 

Se podría decir que el tipo de excepción especifica lo salió mal, mientras que el mensaje/atributos especifican cómo salió mal.

2

Está perfectamente bien.

Sin embargo es posible que desee crear su propia subclase para ayudar a distinguir entre las excepciones incorporadas

Por ejemplo, si tiene algo que funciona como un dict, se puede plantear un KeyError por las razones habituales, pero lo que si el KeyError realmente proviene de un dict subyacente que está utilizando en la implementación.

Elevar 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 no está en el objeto

4

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

Por page you linked, no veo la frase "built-in":

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. 

Tal vez alguien vio a su pregunta y fija la documentación ya.
EDIT: Parece que es posible que haya insertado la documentación para ValueError en lugar de TypeError

+0

Buena captura. ¡Gracias! – EOL

Cuestiones relacionadas