如何从Python 3导入FileNotFoundError?

时间:2014-11-04 21:22:48

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

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

4 个答案:

答案 0 :(得分:27)

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

但是他们不会对你有任何帮助。 FileNotFoundError的重点是任何遇到文件未找到错误的Python操作都会引发该异常。只是定义自己的例外不会成功。您将获得的是OSError(或IOError,具体取决于2.x版本)并具有适当的errno值。如果您尝试处理自定义FileNotFoundError,则永远不会调用您的处理程序。

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

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

答案 1 :(得分:3)

您可以改为使用IOError

  

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

     

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

     

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

答案 2 :(得分:2)

您可以自行创建FileNotFoundError例外:

class FileNotFoundError(OSError):
    pass

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

以下是Python中User-defined Exceptions的参考资料。

答案 3 :(得分:0)

简短答案:只需使用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