检测导入模块中的ImportError

2 投票
1 回答
880 浏览
提问于 2025-04-17 16:03

我想要导入一个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_infotraceback的文档,但没有找到有用的信息。请问怎么才能做到这一点呢?

1 个回答

4

如果异常是在捕获它的同一个函数中发生的,那么堆栈跟踪(也就是错误发生的记录)只会有一层。如果异常是在其他地方发生的,那么堆栈跟踪会有多层。经过查看一些相关问题和做了一些测试,我发现只需要检查一下tb_next是否为None就可以了:

except ImportError:
    traceback = sys.exc_info()[2]
    if ( traceback.tb_next ):
        raise
    pass

注意:虽然关于tb_next的文档不多(我在inspect的文档中看到过提及,但没有具体说明什么算是堆栈跟踪的“层级”),不过上面的行为在Python 2.7.3Python 3.2.3、Jython 2.5.3、IronPython 2.7.3和PyPy 1.8.0之间是一致的。

撰写回答