2010-01-02 9 views
7

Possible Duplicate:
Which exception should I raise on bad/illegal argument combinations in Python?python: ¿Debo usar ValueError o crear mi propia subclase para manejar cadenas inválidas?

He revisado las excepciones integradas de python y lo único que parece cerrado es ValueError.

de documentación de Python:

exception ValueError: Raised when a built-in operation or function receives an argument that has the right type but an inappropriate value, and the situation is not described by a more precise exception such as IndexError.

¿Debo crear una subclase de ValueError, como InvalidFormatException?

(Mi caso particular es si una cadena de números romanos tiene el formato correcto, pero hay muchos otros casos aplicables.)

EDIT: parece que ValueError es la elección correcta, ahora la cuestión es si utilizar ValueError directamente o para subclasificarlo.

Respuesta

7

ValueError es una buena opción para el caso que tenga. Simplemente acéptelo y recuerde que puede especificar un mensaje útil como argumento, lo que le permite distinguirlo de otros tipos de ValueError.

No haría el código más complicado definiendo una subclase, sin embargo, a menos que tuviera una buena razón para querer detectar ese error en particular, pero evito atrapar cualquier otro ValueErrors. Muchas aplicaciones tienen docenas de condiciones de error "especiales", pero si también definieran subclases por caso, el código se volvería rápidamente inmanejable y cualquiera que intentara usar las rutinas se sorprendería constantemente por las nuevas excepciones inesperadas.

+0

Esta es la mejor respuesta (recuerde que puede proporcionar un poco de texto específico con la excepción, y se entrega con trackback); sin embargo, no sería una gran razón para impulsarme a crear una subclase, una barrera extremadamente baja, pero aún presente, en otras palabras. –

+0

@Roger, estoy de acuerdo, y un buen punto sobre el mensaje. He editado para mencionar esa idea útil. –

0

Sí. ;-) ValueError suena como el más aplicable de los integrados, y con una subclase de eso parece que estás haciendo lo mejor posible. También es lo que f.i. '%q' % 1 subiría.

4

ValueError parece lógico:

In [1]: int('abc') 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 

<ipython console> in <module>() 

ValueError: invalid literal for int() with base 10: 'abc' 
0

También apoyo ValueError para este caso. Mis 2 centavos.

2

Voto por crear una subclase única, InvalidFormatException.

ValueError, mientras que es cierto, es vago.

InvalidFormatException es más específico y está directamente relacionado con su problema.

Un usuario podría terminar con situaciones en las que se está haciendo algo que podría producir cualquier error. Podrían estar convirtiendo números romanos y luego haciendo algunas matemáticas. Es posible que necesiten distinguir entre ValueError y InvalidFormatException.

+0

Sí, siempre plantearía una excepción específica personalizada ... no puede doler, pero podría ayudarte más adelante. –

2

Bueno, en realidad depende de si desea (o necesita) que esa excepción en particular sea capturable independientemente de otras ValueError que puedan ocurrir durante la invocación de su código. También depende de si usted es el único consumidor de su código o si está destinado a que otras personas lo utilicen; en el último caso, puede ser útil para estas personas si define algunas excepciones específicas de bibliotecas de alto nivel que pueden verificar.

Cuestiones relacionadas