自定义异常类
- 系统所提供的诸多异常类,并不足以精确地覆盖各种具体业务场景,这时我们就需要用到自定义异常;
- 自定义的异常类,必须继承于系统的某个异常类,并在此基础上扩展;
- 常用来作为父类的异常类有Exception和RuntimeException;
- 一个没有继承系统异常类的普通类,是无法被抛出和处理的;
- 在自定义的异常类中,我们可以按业务逻辑的需要,自定义许多我们自己的属性和方法,这些都有助于调用者精确地进行异常定位和处理;
- 下面的例子定义的是一个非法三角形边长的异常,当用户输入的三个整数无法构成一个三角形进而求取三角形面积时,我们抛出一个这样的异常实例来提示调用者做好预案处理工作;
# 自定义异常类:非法参数异常
class InvalidArgumentError(Exception):
def __init__(self, msg):
self.msg = msg
def info(self):
return "两边之和必须大于第三边,两边之差必须小于第三边"
在合适的场景抛出自定义的异常
- 下面的函数是通过三角形边长求面积的工具函数;
- 当输入的三条边长不合法无法构成一个三角形时,我们抛出一个上面自定义的非法边长异常实例;
- 当调用者触发这个异常后,就知道必须对潜在的非法边长错误进行预处理了;
# 工具方法:计算以a,b,c为边长的三角形的面积
def getTriangleArea(a,b,c):
# 判断边长参数是否合法
if not ((a+b)>c and (b+c)>a and (a+c)>b):
# 如果用户输入的参数不合法,则抛出异常和提示信息
# 创建一个InvalidArgumentError类的对象
raise InvalidArgumentError("边长参数不合法")
p = (a+b+c)/2
area = math.sqrt(p*(p-a)*(p-b)*(p-c))
print(area)
调用者捕获和处理异常
- 调用者使用try…except结构包裹起可能抛出非法边长异常的代码;
- 在非法边长果然发生时,就能够调用异常实例所提供的属性和方法,来精确地提示用户错误的原因了;
try:
getTriangleArea(3,4,9)
# 捕获和处理异常
# e是工具方法所创建和抛出的异常对象
except Exception as e:
print(e.msg,e.info())
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/pangzhaowen/article/details/80299631