用于正确错误处理的Python3 I / O操作的例外列表

时间:2016-01-17 09:59:46

标签: python python-3.x exception exception-handling

我正在尝试写一个这样的文件:

with open(filename), 'wb') as f:
    f.write(data)

但是当打开文件并写入文件时,许多事情可能会出错,我想正确报告用户出错的地方。所以我不想这样做:

try:
    with open(filename), 'wb') as f:
        f.write(data)
except:
    print("something went wrong")

但我想告诉用户更具体的内容,以便他们能够解决问题。所以我开始捕获PermissionError以告诉用户修复他们的权限。但很快我得到了一个错误报告,如果filename指向一个目录,程序就会失败,所以我也抓住并报告了IsADirectoryError。但这不是全部 - 可能是filename的路径不存在,所以后来我也添加了FileNotFoundError

打开文件并写入文件是一个非常简单的模式,但仍有许多问题可能出错。我想知道是否有一个简单的配方允许我捕获这些错误并正确报告它们而不会给出一般的“发生错误”消息。这种模式已经使用了几十年,所以必须有一些要检查的事项清单,不是吗?

我现在抓住了一些例外,但我可以想象更多的是潜伏着。在非Linux平台上运行时,事情可能会变得更糟......

在Python中打开文件并向其写入文件的最佳做法是什么?在出现问题时将最多的信息反馈给用户,而无需重新调整以转移简单的回溯?

在操作系统级别,执行open()write()系统调用时只会出现很多问题,因此必须存在完整的列表?

1 个答案:

答案 0 :(得分:2)

您可以捕获更高级别的异常OSError,然后将strerror字段的值显示给用户作为解释。这取决于FileNotFoundError之类的异常是OSError的子类,并且这些subclasses都可以通过使用基类捕获。

以下是一个例子:

try:
    filename = 'missing_file'
    with open(filename) as f:
        for line in f:
            # whatever....
            pass
except OSError as exc:
    print('{!r}: {}'.format(filename, exc.strerror))

missing_file不存在时运行此代码会产生以下错误消息:

'missing_file': No such file or directory