资讯专栏INFORMATION COLUMN

使用Java Exception机制的正确姿势

Astrian / 3045人阅读

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

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...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66864.html

相关文章

  • 结合Spring发送邮件四种正确姿势,你知道几种?

    摘要:我拿网易邮箱账号举例子,那么我们如何才能让你的邮箱账号可以利用第三方发送邮件这里的第三方就是我们即将编写的程序。 一 前言 测试所使用的环境 测试使用的环境是企业主流的SSM 框架即 SpringMVC+Spring+Mybatis。为了节省时间,我直接使用的是我上次的SSM项目中整合Echarts开发该项目已经搭建完成的SSM环境。 标题说的四种姿势指的是哪四种姿势? 发送text...

    doodlewind 评论0 收藏0
  • NAO机器人学习小计

    摘要:性能和约束只在机器人端可用。机器人的中心在脚上,并且机器人的躯干是笔直向上的的。相对速度,范围从一个布尔值,表明目标姿势是否正确达到。在操控机器人时,使用这个方法以达到显示出动作的效果。机器人可能需要使用者的帮助以达到这个姿势。 NAO APIs nao的接口全部以AL开头,全部继承自ALModule,它被包含在中。下面是ALModule的主要methods。 ALModule API...

    zzzmh 评论0 收藏0
  • Android单元测试 - 验证函数参数、返回值正确姿势

    摘要:验证参数传递函数返回值,是单元测试中十分重要的环节。一般形式单元测试下文称为例子这个单元测试是通过的。不过,仅仅比较两个对象,这个单元测试还是有问题的。单元测试的细节,已经讲得七七八八了。 showImg(http://i1.piimg.com/577986/c22d72463031233b.jpg); 原文链接:http://www.jianshu.com/p/77ee7c0270b...

    waltr 评论0 收藏0
  • 纪念我曾经 JAVA 姿势

    摘要:,关闭不当编译器警告信息。创建固定大小的线程池。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统或者说能够创建的最大线程大小。此线程池支持定时以及周期性执行任务的需求。 目前在搞 Node.js,曾经的 JAVA 知识忘了好多,为此整理了下,感叹下工业语言还是有相当的优势的。 流 Java所有的流类位于java.io包中,都分别继承字以下四种抽象流类型。 Type 字节...

    The question 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<