2009-07-15 14 views
16

C ma perror i errno, które drukują i zapisują ostatni napotkany błąd. Jest to wygodne, gdy robię plik io, ponieważ nie muszę fstat() każdego pliku, który zawodzi jako argument do fopen(), aby przedstawić użytkownikowi powód, dla którego połączenie nie powiodło się.Obsługa wyjątków Python

Zastanawiam się, jaki jest właściwy sposób na pobranie errno, gdy z gracją obsługuję wyjątek IOError w pythonie?

 
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... 

Odpowiedz

26

Wyjątek ma atrybut errno:

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

Oto w jaki sposób można to zrobić. Zobacz również moduł errno i os.strerror dla niektórych programów narzędziowych.

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) 

Więcej informacji na temat IOError atrybutów, zobacz klasy bazowej EnvironmentError:

+1

lepiej niż zaakceptowana odpowiedź! – RichVel

+0

"ioex.strerror" wydaje się być odpowiednikiem 'os.strerror (ioex.errno)' (python 2.7) – Dannid

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

Jest to preferowana składnia teraz, tylko FYI dla tych, którzy oglądają to pytanie w dzisiejszych czasach ... – 2rs2ts

+1

działa w python3 jeśli używasz szelek na wydruku – 2114L3