python中关于函数体内部的异常处理(二)

通过上篇文章我们已经知道怎么捕获异常,以及在函数中异常的处理机制
话不多说,那我们想既想函数可以返回值,又要抛出异常怎么办?
这就需要我们raise关键字了
我们先看一段代码

def calculate(a):
    """
    判断输入是否为数字
    :param a: 用户输入
    :return: float类型
    """
    if str(a).replace(".","",1).isdigit() :
        return float(a)
    else:
        NumError = Exception("输入错误的数字或字母")
        raise NumError
try:
    price = input("请输入橘子价格: ")
    price = calculate(price)
    weight = input("请输入橘子重量: ")
    weight = calculate(weight)
except Exception as err:
    print("输入异常,异常为:{},请重新输入".format(err))
else:
    result = price * weight
    print("付款金额为:{}".format(result))

这段代码你会发现函数中else中没有return,只有raise抛出来的异常
其实这就是raise在函数中特别的作用,那就是相当于return,且return值为异常
你可以这么理解
函数体内部使用try,except捕捉异常,是手动将异常状态调整为正常状态,那函数正常执行,就需要return值
函数体内部使用raise抛出异常,是手动将正常状态调整为异常状态,那函数不正常执行,会直接报错,就不需要return值

这样对于unittest测试框架来说,想让结果正常,那么就让try里的assert异常正常抛出即可,
通过raise抛出异常

def test_02(self):
	try:
	    self.assertEqual(1,2)
	except AssertionError as e:
	    raise e

python是鼓励我们在函数体内部的进行异常处理
因为使用异常来进行错误流程处理才是符合pythonic,且体现了一个python程序员对自己代码的了解程度,在哪里进行异常处理,代表你对自己代码自信程度
所以大家还是多多在自己代码中使用异常处理吧

你可能感兴趣的:(python中关于函数体内部的异常处理(二))