當 被調用對象 遇到執行錯誤時,如何返回給調用者比較好?
一、有三種方式:
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)
二、總結
可以看到,通過捕獲異常的方式,可以讓開發者把精力都放在抽象計算和數據結構上,他的
調用方只需接收異常,不需要再判斷了。