Как получить ошибку IOError?

C имеет perror и errno, которые выводят и сохраняют последнюю обнаруженную ошибку. Это удобно при выполнении file io, поскольку мне не нужно использовать fstat () каждый файл, который не работает, в качестве аргумента функции fopen (), чтобы представить пользователю причину сбоя вызова.

Мне было интересно, как правильно получить errno при аккуратной обработке исключения IOError в 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...

person jr0d    schedule 15.07.2009    source источник


Ответы (3)


Исключение имеет атрибут errno:

try:
    fp = open("nothere")
except IOError as e:
    print(e.errno)
    print(e)
person stefanw    schedule 15.07.2009

Вот как это сделать. Также см. Модуль errno и функцию os.strerror для некоторых утилит.

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)

Дополнительные сведения об атрибутах IOError см. В базовом классе EnvironmentError:

person ars    schedule 15.07.2009
comment
ioex.strerror выглядит эквивалентом os.strerror(ioex.errno) (python 2.7) - person Dannid; 28.06.2016

Различные исключения также могут быть проверены в одном и том же пункте "за исключением", например

try:
    serial_port.open()
except (AttributeError, SerialException) as e:
    print('cannot open serial port: {}'.format(e))
person Oppy    schedule 15.05.2018