#背景
在项目开发中,有时会遇到需要抛异常的场景,下层抛异常,上层使用者需要用try{}catch ()进行捕获,但有时候,捕获的异常信息的定义,会有点犯难,不知道使用哪个异常信息回更好,我前几天写了一个捕获异常信息,我使用的是Trowable e去接收异常,但同事认为应该使用Excption e 接收,因为下游的异常是“throw Exception”,但我想着,throwable是exception 的父类,理论上是可以使用的。
最终也没解释出所以然,归结于自己对异常知识了解的太少,归纳一下,重新学习一下。
看了源码 了解到:
Java语言要求java程序中所有抛出(throw)的异常都必须是从Throwable派生而来。
对于java程序员而言,它一般只需要在它的顶级函数中catch(Exception ex)就可以捕获
出所有的异常对象。所有异常对象的根基类是 Throwable ,Throwable从Object直接继承而来
(这是java系统所强制要求的),并且它实现了 Serializable接口
(这为所有的异常对象都能够轻松跨越Java组件系统做好了最充分的物质准备)。
从Throwable直接派生出的异常类有Exception和Error 。
Exception 和从它派生而来的所有异常都是应用程序能够catch到的
,并且可以进行异常错误恢复处理的异常类型。
而Error则表示Java系统中出现了一个非常严重的异常错误,
并且这个错误可能是应用程序所不能恢复的。
throwable虽然是父类,Throwable类是所有异常信息的超类(父类)。并不是等级越高越好,要有专业性的范围区间。报错信息要有针对性,才是更加适用代码,写出的代码也更有质量。它的直接子类就是Exception 和Error。
针对异常信息,就两个处理方法,:捕获(try catch)或者抛出 (throw)
Exception子类包括可检查异常(如IOException、SQLException)和不可检查异常(如NullPointerException、ArrayIndexOutOfBoundsException),可检查异常必须在代码中显式处理或声明抛出,而不可检查异常通常由编程错误引起,可以在程序中避免发生。
Exception:常用的异常信息
IllegalMonitorStateException | 监控器状态出错引起的异常 |
NegativeArraySizeException | 一数组长度是负数,则产生异常 |
SQLException | 数据库异常 |
NullPointerException | 一程序试图访问一个空的数组中的元素或访问空的对象中的 方法或变量时产生异常 |
OutofMemoryException | 用new语句创建对象时,如系统无法为其分配内存空 间则产生异常 |
SecurityException | 由于访问了不应访问的指针,使安全性出问题而引起异常 |
IndexOutOfBoundsExcention | 由于数组下标越界或字符串访问越界引起异常 |
IOException | 由于文件未找到、未打开或者I/O操作不能进行而引起异常 |
ClassNotFoundException | 未找到指定名字的类或接口引起异常 |
CloneNotSupportedException | 程序中的一个对象引用Object类的clone方法,但 此对象并没有连接Cloneable接口,从而引起异常 |
我看到下层的查询逻辑,使用的是throw Exception 查询逻辑抛出数据库异常很合理。
专人做专事,术业有专攻,既然定义了不通的异常报错,就要有专业的异常名词去接收,这样就更有针对性,这样的异常对于我们来说也是一种已知的异常。
当然了,如果不知道可能会报出什么样的异常,用专业范围小的异常信息去捕获也是捕获不到的,这时就可以使用throwable进行异常捕获。