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

2024-09-27 09:23:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

示例:

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

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

知道为什么吗?在


Tags: from示例data错误exception情况codesome
3条回答

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

我假设通过“pymongo的存在的验证”,你指的是类似于:

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

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

^{pr2}$

假设在脚本的开头,您已经有了import pymongo,我看不出为什么您应该检查或“验证”pymongo是否已导入:import pymongo如果找不到pymongo库,import pymongo将已经引发一个{}。在

如果我没看错你的问题,你想知道如果你还没有导入pymongo模块,except pymongo.errors.OperationFailure在加载模块时不会导致错误。在

与Python中的大多数东西一样,except子句的参数是在运行时计算的。事实上,它们可以是表情!Python不会在“编译”时验证它们,就像它在那个时候验证任何其他名称一样。在

原因是Python是一种动态语言。导入可以有条件地完成,也可以基于“编译”时未知的名称执行,并且可以用代码替换、修改或删除模块和其他命名空间。因此,如果不运行代码,Python实际上无法知道在代码执行过程中,pymongo.errors.OperationFailure是否是一个有效的名称。在

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

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

但如果你这样做:

import pymongo

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

^{pr2}$

如果我的回答对您来说还不够,并且您想知道为什么第一次运行脚本时包含pymongo.errors.OperationFailure不会抛出任何错误,即使您的代码中没有任何import pymongo语句,那么请参见kindall's answer on Python being a dynamic language。在

相关问题 更多 >

    热门问题