Как получить ошибку IOError? - PullRequest
19 голосов
/ 16 июля 2009

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

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

Ответы [ 4 ]

30 голосов
/ 16 июля 2009

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

try:
    fp = open("nothere")
except IOError as e:
    print(e.errno)
    print(e)
26 голосов
/ 16 июля 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:

21 голосов
/ 16 июля 2009
try:
    fp = open("nothere")
except IOError as err:
    print err.errno 
    print err.strerror
2 голосов
/ 15 мая 2018

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

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