2015-02-09 122 views
0

有沒有辦法檢查哪個變量賦值方法拋出異常?例如:檢查哪個變量拋出異常

a = '\xa1' 
b = 'normal string' 

try: 
    c = b.encode('ascii') 
    d = a.encode('ascii') 
except Exception as e: 
    print "error thrown for input: %s" % <figure out which variable threw error> 

在這種情況下,我想輸出說「錯誤拋出輸入:d」,而如果我切換變量,使得C = a.encode(「ASCII」),則輸出會說「輸入錯誤:c」。這是可能的,還是我需要將變量賦值分成兩個不同的try塊?

另外,出於好奇,讓我們假設它是5個,10個或更多的變量,不容易用for循環迭代。那會是5-10個不同的嘗試塊嗎?或者你會把它們堆放在一個列表中,只是爲了for循環?

回答

3

變量從不拋出異常。從調用方法encode中拋出異常。

如果您想知道拋出異常的情況,請將每個encode調用包裝在單獨的try/except塊中。

你也可以看看e

except Exception as e: 
    print(e) 

的輸出\xa1是:

'ascii' codec can't encode character '\xa1' in position 0: ordinal not in range(128) 

在那裏,你看到有問題的輸入。

編輯:

您還可以看看e.args這對於\xa1是:

('ascii', '¡', 0, 1, 'ordinal not in range(128)') 

所以e.args[1]是有問題的輸入。

+0

好了,所以我相信我在試圖簡化我的問題措辭不當。我知道這個變量不會拋出異常,但我想知道哪一行執行了這個操作,並輸出比給出的用戶更友好的消息。我有一個系統,用戶應該輸入數據,如果他們有錯誤,它會顯示一條消息來解決問題。像這樣的消息不會幫助他們那麼多,這就是爲什麼我要確定哪一個會給出異常以用戶友好的消息輸出,以及如果我真的需要多個try/catch塊。 – 2015-02-09 15:57:33

+0

@JarrettPhillips你可以檢查'e.args'。我編輯了我的答案。 – 2015-02-09 16:10:55

+0

這非常有用,雖然我不喜歡它如何不直接告訴我它應該分配哪個變量,但我可以將e.args [1]與輸入進行比較,以查看它是哪個變量。 – 2015-02-09 16:57:02

1

注:在家裏的孩子不要嘗試這個,可讀性統計

a = '\xa1' 
b = 'normal string' 
z = 0 
try: 
    c = b.encode('ascii') 
    z = 1 
    d = a.encode('ascii') 
except Exception as e: 
    print "error thrown for variable %s" % (a if z else b) 

您可以創建一個臨時變量,我們稱之爲Z,將其設置爲0,如果有異常沒有發生爲b變量,然後改變z爲1,最後檢查是否z == 1,如果是的話,那麼在第二個變量中的編碼方法拋出了異常,如果沒有,那麼第一個變量中的編碼方法是拋出例外,我認爲這段代碼運行良好,但我沒有測試它。

0

您可以使用traceback模塊,以獲得更多信息:

a = '\xa1' 
b = 'normal string' 
import sys, traceback 
try: 
    c = b.encode('ascii') 
    d = a.encode('ascii') 
except Exception as e: 
    exc_type, exc_value, exc_traceback = sys.exc_info() 
    traceback.print_tb(exc_traceback) 

File "/.............py", line 65, in <module> 
d = a.encode('ascii') 

traceback.print_tb(exc_traceback)給你行號和問題的變量。

要得到理由:

print("Reason: {}".format(e.reason)) 
Reason: ordinal not in range(128)