2013-02-15 53 views
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

如果在捕获它的相同函数中发生异常,堆栈跟踪将只有一个帧。否则,它将有多个框架。看着related questions和做一些测试后,我发现这是不够的,以检查是否tb_nextNone

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之间是一致的。

+1

听起来像它可能是实施和/或释放依赖如果它没有记录。 – martineau 2013-02-16 03:54:33

+0

@martineau好点,我会留意这个!我可以在几种不同的环境中测试它(CPython,PyPy)并查看是否有任何差异。 – mgibsonbr 2013-02-16 03:58:26