用于解决程序在运行过程中产生的意外情况。语法错误或逻辑错误不算是异常。
一提到异常,大家难免会想到几个关键字。分别是:
try
cach
finally
throw
throws
他们都分别代表什么意思呢
try cach finally
1 | java复制代码try{ |
throw throws
throws:
声明将要抛出何种类型的异常
1 | java复制代码//下面的函数可能会抛出 异常类型1,异常类型2 这两种类型的异常. |
其本身不处理异常,只负责声明和抛出,使用它的人来处理异常
1 | java复制代码调用存在异常声明的方法时 |
throw:
主动/手动抛出一些业务逻辑上的异常,自己手动创建要抛出的异常
1 | java复制代码public void 方法名(){ |
1 | java复制代码public void 方法名() throws Exception{ |
⚠️:throw和throws有本质的区别。不要混为一谈。
throw是抛出异常阶段 的方案:
抛出异常有两种:一种是系统自动产生异常并抛出,一种是手动创建异常抛出(throw)
throws是捕获异常阶段 的方案:
捕获异常处理的方案有两种,一种是try/catch直接处理,一种是抛给别人处理(throws)
自定义异常
定义一个类,继承自异常类
1 | java复制代码public class MyException extends Exception{ |
之后就可以在业务代码中 throw
自己定义的异常了。
异常选择
- 如果父类中的方法没有throws异常,那么,子类中重写该方法时,也不能throws异常。对自己编写的可能出现异常的代码,只能自己try/catch
- 一个方法A中调用了方法 a1,a2,a3。那么,一般情况下a1,a2,a3建议用throws抛出异常,A中对异常进行try/catch。
异常链
多重嵌套抛出异常时,将异常信息一个一个的串联起来抛出的机制。否则只能看到最后一个异常。
- 方式1
throw Exception("本异常描述信息",捕获的异常)
- 方式2
1 | php复制代码 Exception ex = new Exception("本异常描述信息"); |
异常实际案例
接下来,举一个实际项目中的异常捕获方式。但并不是唯一方式。
1.自定义一个全局异常捕获类
1 | java复制代码/** |
2.自定义异常类
我们看到,在上面全局异常捕获类中,有一个自定义异常类。具体内容如下:
在业务处理中,遇到需要抛异常的地方,你就可以构造一个这样的异常,然后抛出去,就会被全局异常捕获并处理了。
1 | java复制代码public interface ExceptionEnumInterface { |
1 | java复制代码public class ServiceException extends RuntimeException{ |
- 抛异常
1 | java复制代码try { |
本文转载自: 掘金