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

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

你可能感兴趣的:(exception)