检测导入模块中的ImportError

时间:2013-02-15 22:35:02

标签: python exception-handling stack-trace

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

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 个答案:

答案 0 :(得分:4)

如果在捕获它的同一函数中发生异常,则堆栈跟踪将只有一个帧。否则,它将有多个帧。在查看related questions并进行一些测试后,我发现它足以检查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之间是一致的。