异常处理的目的在于提高服务的稳定性及用户体验。并确保在异常情况下,服务的数据一致性。
“业务异常”常常被用来泛指所有非正向主流程的业务场景。但是这些场景的处理,在实现上,是否需要异常机制处理这些场景,需要谨慎判断,避免出现使用异常机制处理正常业务的情况。比如:对于“提现”操作,账户余额不足时,会提现失败。这种场景,一般并不建议使用异常来处理,而建议把这种场景做为常规业务流程中的一种。即使使用异常机制来处理,也应当与系统异常严格区分出来。
“技术异常“为两类,一类是可预见的,如运行服务的基础设施出现的错误,包括网络中断,硬盘写满,FD或连接池等软件资源用完等。还另一类不可事先预知的,非预期的行为或异常,时常由程序本身的Bug引起。
一个业务异常需要达成如下几个要求:
业务异常通常表现为自定义的异常类(因为需要携带自定义的信息及异常发生的上下文)
技术异常可以按是否可以预见分两种。
可预见的技术异常应当在系统设计时,通过预先设计的异常处理机制进行规避。避免异常的发生。包括但是不限于:
以上有些异常,尽量以编程语言内置的异常的形式表现出来。
不可预见的异常,应当能在服务内,以统一的方式全局地进行处理,避免巴洛克式异常处理(即,每个地方都做自己的异常处理,每个地方的异常处理方式又非常相似。)如:
此类问题,需要通过以下方式解决:
自定义异常尽量从问题本身的性质出发定义异常,避免以具体场景、发送方、处理方的不同而定义不同的异常类型,以避免异常数量的膨胀。