2008-11-07 11 views
36

Su una semplice operazione di creazione di directory, ad esempio, posso fare un OSError come questo:Esiste un modo multipiattaforma per ottenere informazioni da OSError di 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' 

ora posso prendere che errore come questo:

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

C'è un modo multipiattaforma in cui posso sapere che il 17 o il 'File esiste' significherà sempre la stessa cosa in modo che io possa agire diversamente a seconda della situazione?

(Questo è venuto fino during another question.)

risposta

52

L'attributo errno sull'errore dovrebbe essere la stessa su tutte le piattaforme. Otterrete le eccezioni WindowsError su Windows, ma poiché questa è una sottoclasse di OSError, verrà catturata dallo stesso blocco "except OSError:". Windows ha i propri codici di errore e questi sono accessibili come .winerror, ma l'attributo .errno dovrebbe essere ancora presente e utilizzabile in modo multipiattaforma.

I nomi simbolici per i vari codici di errore sono disponibili nel modulo errno. Per esempio,

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

È inoltre possibile eseguire la ricerca inversa (per scoprire quale codice si dovrebbe utilizzare) con errno.errorcode. Ovvero:

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

Anche su Windows. –

+6

Probabilmente è una buona idea per poi rilanciare l'eccezione originale se non fosse 'EEXIST'. – ford

Problemi correlati