我目前在需要Python 3内置异常的项目中使用Python 2:FileNotFoundError
。我该怎么做?
答案 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版本)。 OSError
和IOError
都继承自EnvironmentError
。
在Python 3中,EnvironmentError
的别名为OSError
。 FileNotFoundError
继承自OSError
,这意味着FileNotFoundError
可以被EnvironmentError
捕获,并且与OSError
和IOError
共享相同的接口。
好消息!这意味着有一种相对简单的方法可以使您的项目同时与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