2011-02-25 12 views
10

Duplicar posible:
python: Should I use ValueError or create my own subclass to handle invalid strings?¿Cómo se indican los argumentos inválidos en Python?

lectura Built-in Exceptions leí:

Todas las excepciones definidas por el usuario también debe ser derivado de esta clase" en lo que respecta a excepción

.

También veo un ValueError que dice:

elevada cuando un sistema incorporado en la operación o función recibe un argumento que tiene el tipo correcto, pero un valor apropiado, y la situación no se describe por una excepción más precisa, como IndexError.

Si deseo presentar una excepción para los argumentos inválidos (el equivalente al ArgumentError de Ruby), ¿qué debo hacer? ¿Debería subir ValueError directamente, o preferiblemente la subclase ValueError con mi propia intención de revelar el nombre?

En mi caso, acepto un argumento clave, pero quiero restringir el conjunto de caracteres en la clave, de manera que solo se acepta /\A[\w.]+\Z/ (expresión regular Perl/Ruby).

Respuesta

7

Creo que la idea general es esta: ValueError casi siempre denota algún tipo de error del cliente (donde 'cliente' significa el programador que usa su interfaz). Hay dos tipos de excepciones de alto nivel en Python:

  • casos poco comunes para el código que normalmente funciona normalmente; el cliente no tiene la culpa

  • errores de uso donde alguna interfaz se usa incorrectamente, o a través de una serie de llamadas a la interfaz, el sistema ha llegado a un estado inconsistente; tiempo para culpar al cliente

En mi opinión, para el primer caso, tiene sentido para crear jerarquías de clases excepción para permitir código de cliente de control preciso sobre qué hacer en casos poco comunes.

En el segundo caso, y ValueError es un ejemplo de esto, le está diciendo al cliente que hicieron algo mal. Las jerarquías de excepción detalladas no son tan importantes aquí, porque el código del cliente probablemente debería corregirse para hacer lo correcto (por ejemplo, pasar los tipos de parámetros correctos en primer lugar).

TL; DR: Solo use ValueError, pero incluya un mensaje útil (por ejemplo, raise ValueError("I'm afraid I can't let you do that, Dave. -HAL 9000"). No haga una subclase a menos que realmente espere que alguien quiera atrapar SubClassError pero no otras ValueError s.

Dicho esto, como mencionó, la Python built-in library hace la subclase ValueError en algunos casos (por ejemplo, UnicodeError).

1

ValueError parece cubrir su situación bastante bien.

+0

¿Tiene sentido subclasificar ValueError de modo que el nombre de la excepción revele la intención, por ejemplo, clase InvalidKeyError (ValueError)? –

Cuestiones relacionadas