2012-01-23 11 views
17

Estoy tratando de implementar un método que devuelve un error cuando no existe un directorio determinado.Aumento de la excepción incorporada con el mensaje predeterminado en python

En lugar de hacer raise OSError("Directory does not exist."), sin embargo, quiero utilizar el mensaje de error incorporado de OSError: OSError: [Errno 2] No such file or directory:. Esto se debe a que estoy elevando la excepción al comienzo de la llamada al método, en lugar de hacerlo más tarde (lo que invocaría el mismo mensaje de python, sin ningún raise necesario).

¿Alguna sugerencia? (Aparte de hacer manualmente OSError("[Errno 2] No such file or directory: "))

+2

Gatillo la excepción y se deja ¿propagar? – delnan

+0

¿Por qué no desea plantear la excepción usted mismo al comienzo de su llamada de método, p. con 'raise OSError (...)'? Es una forma perfectamente válida de decirle a la persona que llama que hay un problema. –

+0

Exactamente lo que estaba tratando de hacer ~ Estaba buscando una forma de acceder a los mensajes de error incorporados. – bow

Respuesta

22
import os 

try: 
    open('foo') 
except IOError as err: 
    print(err) 
    print(err.args) 
    print(err.filename)  

produce

[Errno 2] No such file or directory: 'foo' 
(2, 'No such file or directory') 
foo 

Por lo tanto, para generar una OSError con un uso mensaje similar

raise OSError(2, 'No such file or directory', 'foo') 
+2

+1 no lo sabía! – juliomalegria

+3

Usar los nombres de error del módulo 'errno' y' os.strerror' para traducirlos a una cadena de mensaje localizado es preferible a los valores codificados: 'OSError (errno.ENOENT, os.strerror (errno.ENOENT), nombre de archivo) ' – user3426575

+0

Use ** e.errno, e.filename y e.strerror ** para obtener información sobre la excepción. Tenga en cuenta que parece que estos son todos Ninguno (incluido errno) a menos que se especifiquen al menos dos args para la excepción, con nombre de archivo como tercer argumento. –

-1
try: 
    # ... 
except OSError: 
    raise OSError("your answer") 
+0

lo siento por tal vista, publico la respuesta de android y no tiene código normal de edición – pod2metra

9

Para obtener el mensaje de error para una dado el código de error, es posible que desee utilizar os.strerror:

>>> os.strerror(2) 
'No such file or directory' 

Además, es posible que desee utilizar errno módulo para utilizar las abreviaturas estándar para esos errores:

>>> errno.ENOENT 
2 
>>> os.strerror(errno.ENOENT) 
'No such file or directory' 
+0

Guau, no sabía esto. Esto será útil :). ¡Gracias! – bow

1

creo que el verdadero problema aquí es que es probable que esté haciendo un montón de cheques de antemano en lugar de probando.

try: 
    [CODE] 
except Exception: 
    [HANDLING CODE] 

es mucho mejor que:

if [SPECIAL CASE]: 
    [HANDLING CODE] 
elif [special case]: 
    [SPECIAL CASE] 
[CODE] 
2

creo que "excepción" es el término lenguaje Python para lo que está llamando "error". Entonces use este término mientras busca más información.

Puede que le resulte útil leer Python Standard Library documentation, "6. Built-in Exceptions".

OSError es una de las excepciones incorporadas. Se define en la sección "Excepciones incorporadas", que agrega: "El atributo errno es un código de error numérico de errno, y el atributo strerror es la cadena correspondiente, tal como se imprimiría con la función C perror(). Consulte el módulo errno , que contiene nombres para los códigos de error definidos por el sistema operativo subyacente ".

La ejecución de este código:

raise OSError(42, "my exception string", "no_such_file.dat") 

me da este resultado:

Traceback (most recent call last): 
    Line 1, in <module> 
    raise OSError(42, "my exception string", "no_such_file.dat") 
OSError: [Errno 42] my exception string: 'no_such_file.dat' 

Por lo tanto, creo que el código podría hacer algo como:

raise OSError(2, "No such file or directory", filename) 
Cuestiones relacionadas