【问题标题】:How do I raise a FileNotFoundError properly?如何正确引发 FileNotFoundError?
【发布时间】:2016-07-04 18:54:24
【问题描述】:

我使用的第三方库很好,但不会按照我想要的方式处理不存在的文件。当给它一个不存在的文件时,而不是提高旧的

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

它提出了一些晦涩的信息:

OSError: Syntax error in file None (line 1)

我不想处理丢失的文件,不想捕获或处理异常,不想引发自定义异常,既不想open 文件,也不想创建它它不存在。

我只想检查它是否存在(os.path.isfile(filename) 可以解决问题),如果不存在,则只需引发适当的 FileNotFoundError。

我试过这个:

#!/usr/bin/env python3

import os

if not os.path.isfile("nothing.txt"):
    raise FileNotFoundError

只输出什么:

Traceback (most recent call last):
  File "./test_script.py", line 6, in <module>
    raise FileNotFoundError
FileNotFoundError

这比“文件无语法错误”要好,但是如何使用正确的消息引发“真正的”python 异常,而无需重新实现呢?

【问题讨论】:

    标签: python python-3.x file-not-found


    【解决方案1】:

    传入参数:

    import errno
    import os
    
    raise FileNotFoundError(
        errno.ENOENT, os.strerror(errno.ENOENT), filename)
    

    FileNotFoundErrorOSError 的子类,它接受多个参数。第一个是来自errno module 的错误代码(找不到文件总是errno.ENOENT),第二个是错误消息(使用os.strerror() 来获取),并将文件名作为第三个传递。

    回溯中使用的最终字符串表示是根据这些参数构建的:

    >>> print(FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), 'foobar'))
    [Errno 2] No such file or directory: 'foobar'
    

    【讨论】:

    • 完美!我很难找到正确的写作方式。
    • @zezollo:我已经更新了答案;我现在找到了os.strerror()(我知道在某处存在从错误号到字符串消息的映射)。
    • @chepner:OSError() 类进行映射; OSError(errno.ENOENT, os.strerror(errno.ENOENT), filename) 返回一个 FileNotFound() 实例。但是要创建这样的实例,您仍然必须传入相同的参数。如果变量e 中有errno 常量,请坚持使用OSError(e, os.strerror(e), path)。子类都提供与基类相同的接口。
    • 在 Python 2 中 FileNotFoundError 未定义,因此您应该提升 IOError/OSError,或者将其定义为这些的子类(参见 this question)。
    • @PlasmaBinturong:不,这就是为什么这个问题被标记为python-3.x :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2020-08-13
    • 2018-11-15
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多