2008-11-07 6 views
36

En una simple operación de creación del directorio por ejemplo, puedo hacer una OSError así:¿Existe una forma multiplataforma de obtener información del OSError de Python?

(Ubuntu Linux)

>>> import os 
>>> os.mkdir('foo') 
>>> os.mkdir('foo') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 17] File exists: 'foo' 

Ahora puedo coger ese error como este:

>>> import os 
>>> os.mkdir('foo') 
>>> try: 
...  os.mkdir('foo') 
... except OSError, e: 
...  print e.args 
... 
(17, 'File exists') 

¿Existe una forma de plataforma cruzada en la que pueda saber que el 17 o el 'Archivo existente' siempre significará lo mismo para poder actuar de manera diferente según la situación?

(Esto ocurrió during another question.)

Respuesta

52

El atributo errno en el error debe ser el mismo en todas las plataformas. Obtendrá excepciones de WindowsError en Windows, pero como esta es una subclase de OSError, el mismo bloque "except OSError:" lo detectará. Windows tiene sus propios códigos de error, y se puede acceder a ellos como .winerror, pero el atributo .errno aún debe estar presente y utilizarse de forma multiplataforma.

Los nombres simbólicos para los diversos códigos de error se pueden encontrar en el módulo errno. Por ejemplo,

import os, errno 
try: 
    os.mkdir('test') 
except OSError, e: 
    if e.errno == errno.EEXIST: 
     # Do something 

También puede realizar la búsqueda inversa (para saber qué código se debe utilizar) con errno.errorcode. Es decir:

>>> errno.errorcode[17] 
'EEXIST' 
+0

Funciona en Windows, también. –

+6

Probablemente sea una buena idea volver a publicar la excepción original si no fuera 'EEXIST'. – ford

Cuestiones relacionadas