捕获异常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

【捕获异常Exceptions】将精力都放在抽象计算过程上,而不是放在考虑if,只是遇到异常,我们怎样处理。
此时调用函数,可以这样写:
def call_divide(): try: print(divide(3,0)) print(divide(3,4)) print(divide(3,'4')) except Exception as e: print(e)

调用方,也不需要if……if

    推荐阅读