异常就是程序出现了不正常的情况
异常的体系结构:
一、如何自定义异常?
-
自定义异常概述
当Java提供的本地异常不能满足我们的需求时,我们可以自定义异常
-
实现步骤
- 自定义异常类,extends 继承Excepion (编译时异常)或者RunTimeException(运行时异常)
- 提供无参、带参构造器,传入异常信息
- 使用throws 或try - catch 调用自定义异常
二、项目中的异常是怎么处理的?
处理异常:
如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有两个步骤:
把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
程序停止执行
- throws 向上抛异常,通常用于受检查异常,提醒调用者需要处理该异常。
- try - catch 直接解决异常
- 执行流程
程序从 try 里面的代码开始执行
出现异常,就会跳转到对应的 catch 里面去执行
执行完毕之后,程序还可以继续往下执行
finally 块里面的代码始终都会执行,遇到return也会执行,return的值会先返回再执行finally
顺序是先执行try 有异常执行catch 对应异常的catch块,没有异常,执行finally
-
编译时异常
-
都是Exception类及其子类
-
必须显示处理,否则程序就会发生错误,无法通过编译
-
-
运行时异常
-
都是RuntimeException类及其子类
-
无需显示处理,也可以和编译时异常一样处理
-
-
如图
三、全局异常拦截如何实现?
在编写代码的过程中,会经常遇到对各种程序异常进行处理,但是如果在每个出异常的地方进行单独处理的话,这会引入大量不相关的异常,增加了程序的耦合性。
使用@ControllerAdvice(或
@RestControllerAdvice)
注解标注一个类为全局异常处理类。可以在这个类中定义一个或多个方法来处理不同类型的异常。
在全局异常处理类中,使用@ExceptionHandler注解来指定哪些异常应该由哪个方法处理。可以为通用异常和特定异常类型定义不同的处理方法。
除了使用 @ControllerAdvice
,还可以通过 Spring AOP(面向切面编程)来实现全局异常处理,这种方式可以集中处理所有服务层或控制器中的异常。
注意,在异常处理方法中可以写一个适当的响应日志或者提示信息和状态码来通知客户端发生了错误,这样做是为了方便程序员进行调试。