如何获取IOError的errno?

28

C语言中有perror和errno函数,它们会打印并保存最近遇到的错误。这在进行文件io操作时很方便,因为我不需要对每个无法打开的文件使用fstat()作为fopen()的参数来向用户呈现调用失败的原因。

我想知道在Python中优雅地处理IOError异常时获取errno的正确方法是什么?

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个回答

41

异常对象有一个 errno 属性:

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

31

以下是实现它的方法。还可以查看 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:


1
ioex.strerror 似乎是 os.strerror(ioex.errno)(Python 2.7)的等效方法。 - Dannid

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

2

在相同的 'except' 子句中也可以测试不同的异常,例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接