2012-08-30 50 views
2

我試圖捕獲當您無法加載模塊時發生的任何異常。 目前的結果是「except」塊沒有得到執行。python在加載模塊時捕獲NameError

import sys 
def loadModule(module): 
    try: 
     import module 
    except: 
     print """ 
     Cannot load %s 
     For this script you will need: 
     cx_Oracle: http://cx-oracle.sourceforge.net/ 
     pycrypto: https://www.dlitz.net/software/pycrypto/ 
     paramiko: http://www.lag.net/paramiko/ 
     """ % module 
     sys.exit(1) 

loadModule(cx_Oracle) 

錯誤:

Traceback (most recent call last): 
    File "./temp_script.py", line 16, in <module> 
    loadModule(cx_Oracle) 
NameError: name 'cx_Oracle' is not defined 

回答

5
loadModule(cx_Oracle) 

你認爲你傳遞給這個函數是什麼?目前代碼中沒有任何名稱爲cx_Oracle。這就是爲什麼你會得到一個NameError。你甚至沒有進入功能。

import module 

你不能傳遞變量導入,它解釋你把什麼作爲模塊

在這種情況下的文字名稱,我的問題,你甚至需要一個功能。只需將try /除去到模塊級別並直接導入cx_Oracle即可。

僅僅因爲我很好奇,這裏有一種方法可以製作可重用的異常捕獲導入函數。我不確定何時/如何有用,但這裏是:

from contextlib import contextmanager 
import sys 

@contextmanager 
def safe_import(name): 
    try: 
     yield 
    except: 
     print 'Failed to import ' + name 
     sys.exit(1) 

with safe_import('cuckoo'): 
    import cuckoo 
+0

Doh! ... 你是對的。 *恥辱的頭 –

2

時Python會試圖查找該cx_Oracle變量loadModule功能甚至可以被稱爲前的錯誤發生。

如果你想保持你目前的策略,你可能真的要使用類似importlib.import_module,這樣就可以通過名字導入模塊,如import_module('cx_Oracle')。在你的模塊的頂層

try: 
    import cx_Oracle 
except ImportError: 
    print "Can't load the Oracle module" 
    dosomething() 

我建議做這樣的事情吧。這是處理這種情況的Pythonic方式。

1

總是想想要捕捉哪個異常。不要僅僅通過編碼except:來過度概括。在這種情況下,你想要趕上ImportError。您要傳遞給函數loadModule的參數應該是字符串類型,例如loadModule('cx_Oracle')(然後你將擺脫NameError)。要在loadModule內動態加載模塊,請查看例如Dynamic loading of python modules