1.背景说明:
在 Java 中,我们使用try…catch 进行异常捕获,也可以通过配置全局异常处理器来处理各种异常。
但是try…catch这种方式太繁琐了,每需要时候都需要新定义一个,太臃肿了不方便。相对来说我们可以使用全局异常处理器
,因为它可以使我们在应用程序的任何部分捕获和处理异常并提供一个标准的异常处理逻辑。
在项目开发中,习惯去设计一些自定义的异常类来处理各层的异常。比如:
DAO层会有对应的DAOException.java
Service层有对应的ServiceException.java
Controller层有对应的ControllerException.java
2.下面是配置全局异常处理器的详细步骤:
定义异常处理器类
首先,我们需要定义一个自定义的异常处理器类,该类必须实现接口 UncaughtExceptionHandler 。
package org.jeecg.modules.demo.cloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.sql.SQLIntegrityConstraintViolationException;
/**
* 全局异常处理器
* @ClassName GlobalExceptionHandler
* @Description TODO
* @Author dsj
* @Date 2023/9/14 10:05 AM
*/
@Slf4j
@ResponseBody
@ControllerAdvice(annotations = {RestController.class, Controller.class})
public class GlobalExceptionHandler implements Thread.UncaughtExceptionHandler {
// 重写接口方法,用于处理异常
@Override
public void uncaughtException(Thread t, Throwable e) {
// 处理异常逻辑 自己定义
System.out.println(t + " has unhandled exception:" + e);
}
}
测试异常处理器
最后,我们需要编写测试代码来验证全局异常处理器是否正确地捕获并处理异常。
public static void main(String[] args) {
// 设置全局异常处理器
Thread.setDefaultUncaughtExceptionHandler(new GlobalExceptionHandler());
// 抛出异常
int a = 10 / 0;
// 其他逻辑
}
现在运行应用程序并查看控制台输出,应该可以看到我们定义的异常处理器类被调用并输出了异常信息。
注意:虽然全局异常处理器可以捕获任何未处理的异常,但是在实际开发中,我们应该尽可能地在代码中对可能出现的异常进行处理,而不是依赖于全局异常处理器来捕获和处理异常。