1.全局异常处理介绍
1.1 简介
全局异常处理器即把错误异常统一处理的方法,可以在多个地方使用,而不需要为每个地方编写单独的处理逻辑。它可以帮助开发人员更好地管理异常,并提供一致的错误处理方式。
1.2 优点
1.全局异常处理可以提高代码的重用性和可维护性
2.避免重复编写异常处理代码,减少出错的可能性,提高程序的稳定性。
3.配置简单,将代码复制到项目中就可以使用
2.全局异常处理的实现方式
自己定义一个类,在类上添加**@ControllerAdvice** 注解,在方法上添加**@ExceptionHandler**注解,就完成了一个全局异常处理的搭建,在一个类中可以写多个ExceptionHandler,对于不同类型的ExceptionHandler可以拦截不同类型的exception,然后再最后面设置一个拦截Exception.class的拦截器,用于拦截掉所有的方法,如果全局拦截中有我们不想拦截的异常类,只需要捕获以后再从新抛出即可示。
@ControllerAdvice
设定拦截规则@ExceptionHandler
设定拦截的异常类型
3.全局异常处理代码实现
3.1 定义一个统一返回类
@Getter
@Setter
@AllArgsConstructor
public class Results {
// 返回状态标识
private Integer code;
// 返回数据
private Object data;
// 返回成功或失败的消息
private String msg;
// 成功返回:数据
public static Results success(Object data) {
return success(200, data, "");
}
// 成功返回:数据、消息
public static Results success(Object data, String msg) {
return success(200, data, msg);
}
// 成功返回:自定义状态码、数据、消息
public static Results success(Integer code, Object data, String msg) {
return new Results(code, data, msg);
}
// 失败只返回:消息
public static Results fail(String msg) {
return fail(-1, null, msg);
}
// 失败返回:数据、消息
public static Results fail(Object data, String msg) {
return fail(-1, data, msg);
}
// 失败返回:自定义状态码、数据、消息
public static Results fail(Integer code, Object data, String msg) {
return new Results(code, data, msg);
}
}
3.2 定义全局异常处理
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(value = ArithmeticException.class)
public Results exceptionHandler(ArithmeticException exception){
String ExMsg = exception.getMessage();
log.error(ExMsg);
if (ExMsg.contains("zero")){
return Results.fail(ExMsg);
}
return Results.fail("未知异常!");
}
@ExceptionHandler(Exception.class)
public Results exceptionHandler1(Exception exception){
return Results.fail("处理所有异常!发生的错误是:"+exception.getMessage());
}
}
3.3 制造异常
@Controller
public class BasicController {
// http://127.0.0.1:8080/hello?name=lisi
@RequestMapping("/hello")
@ResponseBody
public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {
int m = 10;
m = m/0;
return "Hello " + name;
}
}
访问网址:http://127.0.0.1:8080/hello?name=lisi
页面结果显示: