为什么异常处理不检查库的存在

时间:2011-11-30 18:52:05

标签: python exception-handling

我不明白为什么python(至少2.7)没有验证错误的异常处理机制。

示例:

try:
    some code selecting data from pymongo
except pymongo.errors.OperationFailure:
    exception

在这种情况下,如果第一次没有调用异常,python将不会验证我是否真的导入了pymongo lib。

知道为什么吗?

3 个答案:

答案 0 :(得分:6)

如果我正确地阅读了您的问题,您想知道如果您尚未导入except pymongo.errors.OperationFailure模块,则pymongo在加载模块时不会导致错误。

与Python中的大多数内容一样,except子句的参数在运行时进行评估。事实上,他们可以是表达! Python不会在“编译”时验证它们,而是在那时验证任何其他名称。

原因是Python是一种动态语言。可以有条件地执行导入,也可以根据“编译”时未知的名称执行导入,并且可以通过代码替换,修改或删除模块和其他名称空间。因此,如果没有运行代码,Python在字面上无法知道pymongo.errors.OperationFailure是否是代码执行中的有效名称。

答案 1 :(得分:1)

根据PyMongo文档,异常pymongo.errors.OperationFailure将“在数据库操作失败时引发”。因此,只有在引发此类错误时才会评估except块。

我假设通过“pymongo存在的验证”你指的是某些东西:

try:
   import pymongo
except:
   print("PyMongo not found!")
   sys.exit(-1)

此方法通常用于以提供后备(和向后兼容性)而不是“验证”导入。例如,在json编码器/解码器的情况下,我们可以尝试使用simplejson库,并使用json库作为后备,如下所示:

try:
   import simplejson as json
except ImportError:
   import json

假设在您的脚本开头已经有import pymongo,我没有看到您应该检查或“验证”已导入pymongo的原因:import pymongo已经如果找不到ImportError库,则引发pymongo

答案 2 :(得分:1)

首先, pymongo.errors.OperationFailure可以在任何地方定义,不仅可以作为pymongo模块的一部分,还可以作为pymongo属性的属性对象在同一文件中定义。

因此,在处理异常时 Python不应检查是否已导入特定模块

但如果你这样做的话:

import pymongo

如果找不到模块,您会看到导入错误实际上是

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    import pymongo
ImportError: No module named pymongo

如果我的答案对您来说还不够,并且您想要了解更多关于为什么第一次运行脚本时pymongo.errors.OperationFailure的包含不会引发任何错误,即使您没有import pymongo {{1}} 1}}代码中的语句,请参阅kindall's answer on Python being a dynamic language