23

C 有 perror 和 errno,它们打印并存储遇到的最后一个错误。这在执行文件 io 时很方便,因为我不必 fstat() 每个失败的文件作为 fopen() 的参数来向用户显示调用失败的原因。

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

在 [1] 中: fp = open("/notthere")
-------------------------------------------------- -------------------------
IOError Traceback(最近一次调用最后一次)

/home/mugen/ in ()

IOError:[Errno 2] 没有这样的文件或目录:'/notthere'


在 [2] 中: fp = open("test/testfile")
-------------------------------------------------- -------------------------
IOError Traceback(最近一次调用最后一次)

/home/mugen/ in ()

IOError:[Errno 13] 权限被拒绝:'test/testfile'


在 [5] 中:尝试:
   ...: fp = open("没有")
   ...:除了 IOError:
   ...:打印“由于某种原因失败了...”
   ...:     
   ...:     
由于某种原因,这失败了......
4

4 回答 4

36

异常有一个errno属性:

try:
    fp = open("nothere")
except IOError as e:
    print(e.errno)
    print(e)
于 2009-07-15T23:18:53.923 回答
29

这是你如何做到的。另请参阅某些实用程序的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:

于 2009-07-15T23:19:32.940 回答
21
try:
    fp = open("nothere")
except IOError as err:
    print err.errno 
    print err.strerror
于 2009-07-15T23:20:51.423 回答
2

也可以在同一个“except”子句中测试不同的异常,例如

try:
    serial_port.open()
except (AttributeError, SerialException) as e:
    print('cannot open serial port: {}'.format(e))
于 2018-05-15T15:35:44.300 回答