2013-02-15 62 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