2009-07-15 23 views
16

C ha perror e errno, che stampano e memorizzano l'ultimo errore riscontrato. Questo è utile quando si esegue il file io poiché non è necessario fstat() ogni file che non funziona come argomento per fopen() per presentare all'utente un motivo per cui la chiamata non è riuscita.Python Gestione delle eccezioni

Mi chiedevo quale sia il modo corretto per catturare errno quando si gestisce con garbo l'eccezione IOError in python?

 
In [1]: fp = open("/notthere") 
--------------------------------------------------------------------------- 
IOError         Traceback (most recent call last) 

/home/mugen/ in() 

IOError: [Errno 2] No such file or directory: '/notthere' 


In [2]: fp = open("test/testfile") 
--------------------------------------------------------------------------- 
IOError         Traceback (most recent call last) 

/home/mugen/ in() 

IOError: [Errno 13] Permission denied: 'test/testfile' 


In [5]: try: 
    ...:  fp = open("nothere") 
    ...: except IOError: 
    ...:  print "This failed for some reason..." 
    ...:  
    ...:  
This failed for some reason... 

risposta

26

L'eccezione ha un attributo errno:

try: 
    fp = open("nothere") 
except IOError as e: 
    print(e.errno) 
    print(e) 
23

Ecco come si può fare. Vedere anche il modulo errno e la funzione os.strerror per alcune utilità.

import os, errno 

try: 
    f = open('asdfasdf', 'r') 
except IOError as ioex: 
    print 'errno:', ioex.errno 
    print 'err code:', errno.errorcode[ioex.errno] 
    print 'err message:', os.strerror(ioex.errno) 

Per ulteriori informazioni su IOError attributi, vedere l'EnvironmentError classe base:

+1

meglio della risposta accettata! – RichVel

+0

'ioex.strerror' sembra essere l'equivalente di' os.strerror (ioex.errno) '(python 2.7) – Dannid

20
try: 
    fp = open("nothere") 
except IOError as err: 
    print err.errno 
    print err.strerror 
+9

Questa è la sintassi preferita ora, solo una FYI per coloro che visualizzano questa domanda al giorno d'oggi ... – 2rs2ts

+1

funziona in python3 se usi parentesi graffe sulla stampa – 2114L3