2009-07-15 10 views
16

C a perror et errno, qui impriment et stockent la dernière erreur rencontrée. Ceci est pratique lorsque je fais le fichier io car je n'ai pas besoin de fstat() pour que fopen() soit présenté à l'utilisateur avec une raison pour laquelle l'appel a échoué.Python Gestion des exceptions

Je me demandais quelle est la bonne façon de saisir errno lors de la gestion gracieuse de l'exception IOError dans 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... 

Répondre

26

L'exception a un errno attribut:

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

Voici comment vous pouvez le faire. Voir aussi le module errno et la fonction os.strerror pour certains utilitaires.

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) 

Pour plus d'informations sur les attributs IOError, voir la classe de base EnvironmentError:

+1

mieux que la réponse acceptée! – RichVel

+0

'ioex.strerror' semble être l'équivalent de' os.strerror (ioex.errno) '(python 2.7) – Dannid

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

Ceci est la syntaxe préférée maintenant, juste un FYI pour ceux qui consultent cette question de nos jours ... – 2rs2ts

+1

fonctionne dans python3 si vous utilisez des accolades sur l'impression – 2114L3

Questions connexes