检测导入模块中的ImportError
我想要导入一个Python模块,如果这个模块存在就导入,但如果不存在就忽略掉错误。不过,如果这个模块本身出现了ImportError
错误,我也不想忽略这个错误,这样我就不知道模块虽然存在但有问题了(也就是说,如果模块存在,但有一些bug,我想知道)。
for app in INSTALLED_APPS:
try:
module = __import__('{}.mycustommodule'.format(app))
# Do something with it
except ImportError:
traceback = sys.exc_info()[2]
if ( ? ): # if the exception occurred in app.mycustommodel, raise
raise
pass # otherwise, ignore
我查看了sys.exc_info和traceback的文档,但没有找到有用的信息。请问怎么才能做到这一点呢?
1 个回答
4
如果异常是在捕获它的同一个函数中发生的,那么堆栈跟踪(也就是错误发生的记录)只会有一层。如果异常是在其他地方发生的,那么堆栈跟踪会有多层。经过查看一些相关问题和做了一些测试,我发现只需要检查一下tb_next
是否为None
就可以了:
except ImportError:
traceback = sys.exc_info()[2]
if ( traceback.tb_next ):
raise
pass
注意:虽然关于tb_next
的文档不多(我在inspect
的文档中看到过提及,但没有具体说明什么算是堆栈跟踪的“层级”),不过上面的行为在Python 2.7.3、Python 3.2.3、Jython 2.5.3、IronPython 2.7.3和PyPy 1.8.0之间是一致的。