2

如果 Python 模块存在,我想导入它,但ImportError如果它不存在则忽略它。但是,如果导入的模块本身引发了ImportError,这个错误也将被忽略,这不是我需要的(即如果模块存在,但有一些错误,我想知道)。

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的文档,但没有找到任何有用的信息。如何才能做到这一点?

4

1 回答 1

4

如果异常发生在捕获它的同一函数中,则堆栈跟踪将只有一帧。否则,它将有多个帧。在查看了相关问题并进行了一些测试后,我发现检查 if tb_nextis就足够了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。

于 2013-02-15T22:35:01.987 回答