博客 / 詳情

返回

捕獲異常Exceptions

當 被調用對象 遇到執行錯誤時,如何返回給調用者比較好?

一、有三種方式:
a. 什麼都不處理,直接報錯

這種方式顯然是不合理的

b. 針對某種情況返回一個特定值,舉個例子

def divide(a, b):
    if b == 0:
        return -1
    if type(a) not in(int, float) or type(b) not in (int, float):
        raise ValueError("divide function called with bad args")
    else:
        return a/b
如果divide函數這樣寫,會有四個弊端:
1)繁瑣
針對三種返回結果,現在call_divide函數如果調用它,就必須對三種調用結果進行判斷,然後處理邏輯。那如果還有call_call_divide函數調用call_divide呢?這意味着後面的整個調用鏈都必須為這種“不同情況的特定返回值”進行判斷,這是非常繁瑣的。
2)不好維護和修改
而如果divide函數有所變化,那後面的調用鏈還必須跟着變化,這很不好維護和修改。
3)降低效率
每次執行divide,都要走一遍if……if……

c. 捕獲異常
實現方式如下:

def divide(a, b):
    try:
        res = a / b
    except ZeroDivisionError:
        res = 'NaN'  #這裏也可以raise
    except:
        raise ValueError("divide function called with bad args")
    return res

將精力都放在抽象計算過程上,而不是放在考慮if,只是遇到異常,我們怎樣處理。
此時調用函數,可以這樣寫:

def call_divide():
    try:
        print(divide(3,0))
        print(divide(3,4))
        print(divide(3,'4'))
    except Exception as e:
        print(e)

二、總結
可以看到,通過捕獲異常的方式,可以讓開發者把精力都放在抽象計算和數據結構上,他的
調用方只需接收異常,不需要再判斷了。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.