簡體   English   中英

什么是處理異常的首選方法?

[英]What is preferable way to handle exceptions?

如果我在編寫代碼時不確定某些內容,那么我正在嘗試再次閱讀The Zen of Python 這一次,這些線條讓我猶豫不決。

Errors should never pass silently.
Unless explicitly silenced.

在當前代碼中,我有一些函數可能如下所示:

def add_v_1(a, b):
    return a + b 

所有對他們的要求都是:

c = add_v_1(7, [])

此類代碼的異常將冒出並在上層捕獲。

但它應該是這樣嗎?

add_v_1可以引發TypeError異常,我想從中恢復。 因此,可能的函數調用將是:

try:
    c = add_v_1(7, [])
except TypeError:
    print "Incorrect types!"

但對於每次通話,我都應該進行異常處理。 哪個看起來很沉重。

所以,我可以這樣做:

def add_v_2(a, b):
    try:
        return a + b
    except TypeError:
        print "Incorrect types!"

並且電話會是:

c = add_v_2(7, [])

看起來更干凈。

似乎所有這些方法都遵循The Zen of Python但其中哪一個是更好的選擇?

參考你的例子,你是否應該在函數內捕獲異常是有爭議的。 這樣做會從函數返回None ,然后函數會通過檢查函數的返回值來加重調用代碼,並將None視為錯誤。 它通過錯誤檢查有效地替換了異常處理。 前者通常更像Pythonic。

您應該詢問是否有必要捕獲錯誤,例如嘗試添加2種完全不同的數據類型。 在這種情況下這樣做似乎是一個編程錯誤,而不是你在正常執行期間所期望的那種事情。

你能做些什么來處理這樣的錯誤? 似乎沒有任何有用的值可以在函數的預期輸出的域內返回...除了None ,表示無法生成結果。 但調用代碼仍然必須執行某種錯誤檢查...所以它也可能只是處理一個異常 - 至少它只需要處理一次。

但這個例子是人為的,很難給出全面的建議。 在這種特殊情況下,由於上述原因,我將允許異常傳播到調用代碼並在那里處理它。

當您能夠從中恢復時,您應該處理除外。 如果您嘗試添加兩個具有不兼容類型的值,則無法從中恢復(沒有進一步的上下文)。

讓我們假設你編寫了一個IntegerWrapper類,你的函數“add_v_2”通常應該嘗試連接兩個值。

def add_v_2(a, b):
    try:
        return a + b
    except TypeError as e:
        if isinstance(a, IntegerWrapper):
            return str(a) + b
        else:
            print("I dont know how to handle this type: " + type(a).__name__)
            # reraise the error so the caller can handle it
            raise

這將試圖從“錯誤類型” a存在中恢復,但如果你知道如何從中恢復。 如果它不知道(a是另一種類型)它會重新引用異常,所以知道如何處理它的人會看到錯誤。

(當然,該實現包含錯誤,它並不意味着“良好的實現”)

輸入:

def add_v_2(a, b):
    try:
        return a + b
    except Exception as e:
        print str(e)
c = add_v_2(7, [])
print (c)

輸出:

unsupported operand type(s) for +: 'int' and 'list'
None

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM