如何获取 IOError 的 errno?

Posted

技术标签:

【中文标题】如何获取 IOError 的 errno?【英文标题】:How to get the errno of an IOError? 【发布时间】:2010-11-11 04:48:24 【问题描述】:

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: ...:打印“由于某种原因失败了...” ...: ...: 由于某种原因,这失败了......

【问题讨论】:

【参考方案1】:

异常有一个errno 属性:

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

【讨论】:

【参考方案2】:

您可以这样做。另请参阅 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)
http://docs.python.org/library/errno.html http://docs.python.org/library/os.html

有关 IOError 属性的更多信息,请参阅基类 EnvironmentError:

http://docs.python.org/library/exceptions.html?highlight=ioerror#exceptions.EnvironmentError

【讨论】:

ioex.strerror 似乎等同于 os.strerror(ioex.errno) (python 2.7)【参考方案3】:
try:
    fp = open("nothere")
except IOError as err:
    print err.errno 
    print err.strerror

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于如何获取 IOError 的 errno?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决打开文件时出现IOError[errno 17]文件?

IOError:[Errno 套接字错误] 使用 BeautifulSoup

如何修复以下 Django 错误:“类型:IOError”“值:[Errno 13] 权限被拒绝”

如何获取桌面位置?

Python 请求:IOError:[Errno 22] 无效参数

IOError:[Errno 13] 权限被拒绝: