当“try .. except IOError”未捕获时如何处理 FileNotFoundError?

Posted

技术标签:

【中文标题】当“try .. except IOError”未捕获时如何处理 FileNotFoundError?【英文标题】:How to handle FileNotFoundError when "try .. except IOError" does not catch it? 【发布时间】:2015-04-22 09:38:58 【问题描述】:

如何在 python 3 上发现错误?我用谷歌搜索了很多,但似乎没有一个答案有效。文件 open.txt 不存在,所以它应该打印 e.errno。

这是我现在尝试的:

这是我定义的函数

try:
    with open(file, 'r') as file:
        file = file.read()
        return file.encode('UTF-8')
except OSError as e:
    print(e.errno)

但是,当我收到此错误时,我没有打印任何内容

FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

【问题讨论】:

不相关:不要在相同的上下文中为不同的目的使用相同的名称。请改用text = file.read()。保持文本为 Unicode,除非绝对必要,否则不要将其编码为字节。 确保运行正确的文件。提供完整的回溯。 Python's "open()" throws different errors for "file not found" - how to handle both exceptions?的可能重复 【参考方案1】:

FileNotFoundErrorOSError 的子类,捕获它或异常本身:

except OSError as e:

操作系统异常已在 Python 3.3 中重新设计; IOError 已合并到 OSError。请参阅 What's New 文档中的 PEP 3151: Reworking the OS and IO exception hierarchy section。

如需了解更多详情,请通过OS Exceptions section 了解更多信息,请向下滚动查看类层次结构。

也就是说,您的代码应该仍然可以工作,因为 IOError 现在是 OSError 的别名:

>>> IOError
<class 'OSError'>

确保将异常处理程序放置在正确的位置。仔细查看异常的回溯,以确保您没有错过实际引发的位置。最后但同样重要的是,您确实重新启动了 Python 脚本,对吧?

【讨论】:

我更新了我的代码,你发现有什么问题吗?莫非是回线的错? @ThomasW:我无法用该代码重现您的问题;它只是为我打印2。不,返回线在这里不会造成任何问题。 你是如何解决这个@ThomasW的?我在这里偶尔得到这个github.com/pypa/pip/blame/master/src/pip/_internal/req/… 在linux上使用python的嵌入式版本...... @crizCraig:“偶尔”,还是在特定的 Python 版本上? open() 可以在 Python 3.2 或之前的版本中抛出 OSError @crizCraig:换句话说,那里的代码没有正确地向后兼容 Python 2.x;它应该使用except (IOError, OSError) as e:

以上是关于当“try .. except IOError”未捕获时如何处理 FileNotFoundError?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序未运行时,GCM 推送通知未在某些设备中显示

didReceiveRemoteNotification:当应用程序处于后台并且未连接到Xcode时未调用fetchCompletionHandler

当连接关闭时,未提交的事务会发生啥?

android:当缩小为真时未发送邮件

为啥当我使用箭头函数 onClick 时我的变量未定义?

当文件中明确指定 executionRoleArn 时,为啥我会收到关于未指定的错误?