【问题标题】:How do I import FileNotFoundError from Python 3?如何从 Python 3 导入 FileNotFoundError?
【发布时间】:2014-12-31 22:35:51
【问题描述】:

我目前在一个需要 Python 3 内置异常的项目上使用 Python 2:FileNotFoundError。我该怎么做?

【问题讨论】:

  • 你不能那样做。为什么不自己定义异常?
  • try 然后except:pass
  • @Hackaholic Err... 不。他为什么要这么做?

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


【解决方案1】:

您可以简单地自己创建FileNotFoundError 异常:

class FileNotFoundError(OSError):
    pass

这个新的异常类继承自 OSError,就像 Python 3.x 中的一样。

这是 Python 中User-defined Exceptions 的参考。

【讨论】:

    【解决方案2】:

    你当然可以定义任何你想要的例外。

    但他们不会对你有任何好处。 FileNotFoundError 的全部意义在于,任何遇到 file-not-found 错误的 Python 操作都会引发该异常。仅仅定义你自己的异常并不能实现这一点。您将得到的只是具有适当errno 值的OSError(或IOError,取决于2.x 版本)。如果您尝试处理自定义 FileNotFoundError,您的处理程序将永远不会被调用。

    所以,你真正想要的是(例如):

    try:
        f = open(path)
    except OSError as e:
        if e.errno == errno.ENOENT:
            # do your FileNotFoundError code here
        else:
            raise
    

    【讨论】:

    • @Mansour:对于 2.6-2.7,两者划分得相当干净。对于旧版本(尤其是如果您不使用 CPython),情况就不同了(有些事情,比如套接字连接错误,两者都没有)。因此“取决于 2.x 版本”。为了安全起见,您总是可以同时捕获两者,或者(除非您需要回到 1.5)它们的公共子类 EnvironmentError。
    • 因此,如果它“取决于 2.x 版本”,并且开发人员不知道期望哪个 2.x 版本,那么他们应该只使用 errno.ENOENT 捕获 EnvironmentError
    【解决方案3】:

    您可以改用IOError

    当 I/O 操作(例如 print 语句、内置 open() 函数或文件对象的方法)由于 I/O 相关原因失败时引发,例如,“文件未找到” 或“磁盘已满”。

    这个类是从 EnvironmentError 派生的。有关异常实例属性的更多信息,请参阅上面的讨论。

    在 2.6 版中更改:更改了 socket.error 以将其用作基类。

    【讨论】:

    • 你能提供更多的上下文吗?通常,一个句子的答案是不够的。
    • 文档的链接或引用会很棒。 ^^ 那更具包容性 +1
    • 我已经添加了报价。并突出显示“找不到文件”部分:-)
    【解决方案4】:

    简答:只需使用EnvironmentError 并检查err.errno == errno.ENOENT 是Python 2 还是Python 3。

    长答案:

    正如其他答案所提到的,FileNotFoundError 是 Python 3 的新手。

    Python 2 使用了OSError(或IOError,取决于 2.x 版本)。 OSErrorIOError 都继承自 EnvironmentError

    在 Python 3 中,EnvironmentError 别名为 OSErrorFileNotFoundError继承自OSError,也就是说FileNotFoundError可以被EnvironmentError捕获,并且与OSErrorIOError共享同一个接口。

    所以,好消息!这意味着有一种相对简单的方法可以让您的项目同时兼容 Python 2 和 Python 3:将 FileNotFoundError 排除在外,然后直接使用 EnvironmentError

    # Works for Python 2.  Also works for Python 3.
    import errno
    
    try:
        open("fake.file", 'r')
    except EnvironmentError as err:
        if err.errno == errno.ENOENT: # ENOENT -> "no entity" -> "file not found"
            print("Caught 'file not found' exception")
        else:
            raise
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-09
      • 2021-04-21
      • 2012-09-20
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      相关资源
      最近更新 更多