java项目当中的全局异常处理
1.开发一个全局异常处理器:
package com.atguigu.spzx.common.exception;
import com.atguigu.spzx.model.vo.common.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @version: java version 1.8
* @Author: Mr Orange
* @description:
* @date: 2025-02-04 15:59
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result handleException(Exception e){
//打印异常信息
e.printStackTrace();
return Result.fail(e.getMessage());
}
@ExceptionHandler(IllegalArgumentException.class)
public Result illegalArgumentException(IllegalArgumentException e){
//打印异常信息
System.out.println("打印非法参数异常");
e.printStackTrace();
return Result.fail(e.getMessage());
}
}
2.在spzx-manager中使用全局异常处理器:
方式一:在启动类上使用@Import注解导入全局异常处理器到spring容器中
@Import()
@ComponentScan()
方式二:自定义注解对@Import注解进行封装,然后在启动类上使用自定义注解
package com.atguigu.spzx.common.anno;
import com.atguigu.spzx.common.exception.GlobalExceptionHandler;
import org.springframework.context.annotation.Import;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @version: java version 1.8
* @Author: Mr Orange
* @description:
* @date: 2025-02-04 19:26
*/
//加在类上
@Target(ElementType.TYPE)
//运行时生效
@Retention(RetentionPolicy.RUNTIME)
@Import(GlobalExceptionHandler.class)
public @interface EnableGlobaleExceptionHandler {
}
- - - - **全局异常处理2**
以前写法,所有的Controller层方法均需要增加`try-catch`逻辑,使用Spring MVC提供的**全局异常处理**功能,可以将所有处理异常的逻辑集中起来,进而统一处理所有异常,使代码更容易维护。
具体用法如下,详细信息可参考[官方文档](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-exceptionhandler.html):
1.创建一个自定义的运行异常LeaseException
package com.atguigu.lease.common.exception;
import com.atguigu.lease.common.result.ResultCodeEnum;
import lombok.Data;
@Data
public class LeaseException extends RuntimeException{
//异常状态码
private Integer code;
/**
* 通过状态码和错误消息创建异常对象
* @param message
* @param code
*/
public LeaseException(String message, Integer code) {
super(message);
this.code = code;
}
/**
* 根据响应结果枚举对象创建异常对象
* @param resultCodeEnum
*/
public LeaseException(ResultCodeEnum resultCodeEnum) {
super(resultCodeEnum.getMessage());
this.code = resultCodeEnum.getCode();
}
@Override
public String toString() {
return "LeaseException{" +
"code=" + code +
", message=" + this.getMessage() +
'}';
}
}
2. 开发一个全局异常处理类
package com.atguigu.lease.common.exception;
import com.atguigu.lease.common.result.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result error(Exception e){
e.printStackTrace();
return Result.fail();
}
@ExceptionHandler(LeaseException.class)
public Result error(LeaseException e){
e.printStackTrace();
return Result.fail(e.getCode(),e.getMessage());
}
}
上述代码中的关键注解的作用如下
`@ControllerAdvice`用于声明处理全局Controller方法异常的类
`@ExceptionHandler`用于声明处理异常的方法,`value`属性用于声明该方法处理的异常类型
`@ResponseBody`表示将方法的返回值作为HTTP的响应体(无)
**注意:**
全局异常处理功能由SpringMVC提供,因此需要在**common模块**的`pom.xml`中引入如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- **修改Controller层代码**
由于前文的`GlobalExceptionHandler`会处理所有Controller方法抛出的异常,因此Controller层就无需关注异常的处理逻辑了,因此Controller层代码可做出如下调整。直接throw异常就行
public void removeApartmentById(Long id) {
if(roomInfoService.count(new LambdaQueryWrapper<RoomInfo>().eq(RoomInfo::getApartmentId,id))>0){
throw new LeaseException(ResultCodeEnum.DELETE_ERROR);
}}