使用Java Exception机制的正确姿势

1、异常是什么?

父类为Throwable,有Error和Exception两个子类

Error为系统级别的异常(错误)

Exception下有众多子类,常见的有RuntimeException,SQLException,IOException等,其中最特殊的为RuntimeException(运行时异常),RuntimeException为unchecked Exception,编译期不强制捕获,系统会自动往上抛,如程序无处理,会自动调用e.printStackTrace(),输出到命令行。RuntimeException以外的异常为check Exception,调用抛出了checked Exception的方法,编译期会强制要求对异常进行处理(try catch 或者继续往上抛,此类异常最终必须得到处理,否则编译不通过)

注:具体详细结构请查看源码或通过互联网渠道搜索

2、为什么要使用异常?

进行代码设计时,每一行代码都可能产生错误,有些错误可以立即处理,而有些错误可能在当前的逻辑中无法立即处理(因为作为方法提供者并不知道调用者出错之后想做什么操作),异常解决的便是这种问题,让错误被延迟处理,,作为提供者只需要告诉用户出了什么问题,至于用户得知问题时如何处理,无需关心。

3、JDK中的异常机制

JDK中已有一系列的异常,是Java为开发者提供的常用异常,IO,util等包中的方法也有抛出相关的checked Exception,JDK提供的RuntimeException均因编程错误导致,在开发者不使用自定义RuntimeException的情况下,可通过代码修改进行规避,从这方面看,JDK提供的RuntimeException更大的作用在于调试。

4、如何良好的在代码中设计异常机制?

checked Exception本身设计的出发点是极好的,通过编译器的强制捕获,可以明确提醒调用者处理异常情况。但使用此种异常后,该Exception会像病毒一样,得不到处理后会污染大量代码,同时也可能因为调用者的不当处理,会失去异常信息。

而某些提供者与调用者可以处理或者通过契约可以避免的问题也不该滥用checked Exception,只有那些程序之外的问题,程序本身无法保证不出异常时才该使用checked Exception,例如IO,SQL等。

为了代码的可读性和稳健性,结合一些资料,我个人的做法是自定义继承自Runtime Exception的异常,同时可扩展一些功能(结合错误码),把程序中的异常进行统一包装,再利用ControllerAdvice进行统一的捕获处理,同时该异常也可以作为所有程序非正常情况终止的出口。

具体使用方法,请参考此demo:https://github.com/Zhangchiii...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值