2016-06-08 21 views
2

如果我不能預先知道引發了什麼類型的異常,我該如何測試一個函數是否返回了異常對象?如何用`if`語句測試異常對象?

def func(): 
    try: 
     bad_thing_happens # NameError("global name 'bad_thing_happens' is not defined",) 
     return True 
    except Exception as e: 
     return e 

result = func() 
if result == Exception: 
    print 'a bad thing happened' 

在這種情況下,if語句返回False,我會錯過異常?

+2

只是讓異常傳播到函數之外,然後在其他地方捕獲它。你不需要趕上它,然後返回它,例外情況是一個例外的情況,而不是一個正常的回報。 – pvg

+1

另外,至少有10倍的10次,捕捉'Exception'是一個壞主意。如果你不知道異常的類型,你很少會真正知道如何正確處理它......有時候你可以做的最好的事情就是讓你的程序崩潰,查看堆棧跟蹤來找出爲什麼它死亡並修復該錯誤/邏輯,以便它不會在下一次死亡。 – mgilson

+0

謝謝大家的好評,例外情況變得更加清晰:) – derrend

回答

5

正確的方法是捕捉函數外的異常。例如:

def func(): 
    bad_thing_happens 
    # NameError("global name 'bad_thing_happens' is not defined",) 
    return True 

try: 
    result = func() 
except NameError: 
    print("a bad thing happened") 

這使得它更清楚其中的例外是從(函數)來了,避免了試圖返回一個異常混亂 - 畢竟,異常通常意味着要抓住並沒有回來。

2

如果你不能改變func()出於某種原因(例如,它是一個第三方庫代碼的一部分),您可以通過isinstance()檢查返回值的類型:

if isinstance(result, Exception): 
    print 'a bad thing happened' 

如果你可以更改func(),那麼你不應該返回異常 - 它們意味着被提出(並重新提出),抓住並處理(也不會被處理)。

+0

oooh,我喜歡那樣:) – derrend

6

功能返回例外,而不是提高它們或讓它們冒泡是一件壞事。

也就是說,您可以使用isinstance(object, klass)來測試一個對象是否是一個類的實例。