4.2.2 自定义异常且与except整合使用

在上文里,遇到业务场景异常时,我们抛出的是Exception这个异常处理的基类,只是在其中通过字符串定义异常的描述信息。在某些场景里,我们在抛出异常时,为了处理方便,或许还要指定错误码和处理人邮件等信息,对此我们可以通过自定义异常来实现此类需求。

在如下的DefineException.py范例中,我们自定义的异常类继承了Exception基类,并在其中定义了错误码等和异常处理相关的信息。而且,本范例还整合使用了raise和except,这样就不会因抛出异常而导致程序终止了。


01 # coding=utf-8
02 class OrderBusinessException(Exception):
03     def __init__(self,msg, errorCode, email):
04         self.msg = msg
05         self.errorCode = errorCode
06         self.email = email
07 
08 def handleOrder(name,number):
09     if(number<=0):
10         raise OrderBusinessException('Order Number less than 0','100', 'xx@163.com')
11     else:
12         print('Handler Order Correctly')
13 handleOrder('PythonBook',1) # Handler Order Correctly
14 try:
15     handleOrder('PythonBook',-1) # 会触发异常,程序中断
16 except OrderBusinessException as e:
17     # 本except里的三句print语句会执行
18     print(e.msg)
19     print(e.errorCode)
20     print(e.email)
21 except Exception as e:
22     print(e) # 用Exception来兜底
23 print('continue')  # 会继续执行后继代码

在第2行到第6行里,我们通过继承Exception定义了基于订单业务的OrderBusinessException异常处理类,在其中第3行的__init__构造方法里,通过参数指定了异常处理的相关信息。

在第8行的handleOrder方法里,当第9行的if语句判断订单数量小于等于零时,此时抛出的是自定义的OrderBusinessException异常,且在创建该异常时指定了错误描述信息、错误码和处理人邮件等信息。

而且,在第15行引发的异常被第16行的except从句成功处理,在该从句里,可以获取异常信息并做对应的处理。正是因为这里用except合理地处理了异常,所以能继续执行后面第23行的打印语句。

额外再说一句,这里除了用OrderBusinessException自定义异常、捕获并处理了可能出现的业务异常外,还在第21行用Exception类来兜底,避免因出现不可控异常而导致的程序终止情况。