在Spring Boot中,我们可以通过@ControllerAdvice和@ExceptionHandler注解来实现全局异常处理。
@ControllerAdvice注解用于定义一个全局的异常处理类,我们可以在该类中定义多个@ExceptionHandler方法,用于处理不同类型的异常。这样,在系统发生异常时,Spring框架会自动调用相应的@ExceptionHandler方法来处理异常,返回处理后的结果给客户端
代码级别异常
代码级别异常通常是指由程序代码引起的异常,通常由程序逻辑错误、数据输入错误、空指针引用等引起。代码级别异常通常是我们在软件开发过程中最常遇到的异常。
代码级别异常通常可以通过编写代码来预防或处理。以下是一些常见的代码级别异常:
- 空指针引用:当程序试图访问一个空对象的成员变量或者调用空对象的方法时,会发生空指针引用异常。
- 数组越界:当程序试图访问数组中不存在的元素时,会发生数组越界异常。
- 类型转换错误:当程序试图将一个不兼容的数据类型转换为另一种类型时,会发生类型转换异常。
- 输入数据错误:当程序接收到非法的输入数据时,会发生输入数据异常,例如输入的字符串无法转换为数字或者日期格式等。
- 文件访问错误:当程序试图访问不存在的文件或者试图对只读文件进行写入操作时,会发生文件访问异常。
@ControllerAdvice
@Slf4j
public class RestExceptionHandler {
@ExceptionHandler(Exception.class)
public <T> DataResult<T> exception(Exception e){
log.error("exception:{}",e);
return DataResult.fail(ResponseCode.SYSTEM_ERROR.getCode(),ResponseCode.SYSTEM_ERROR.getMessage());
}
}
业务主动抛出异常
在业务开发过程中,有时候需要根据业务逻辑的处理结果来主动抛出异常。这样可以让上层调用者(例如控制层或服务层)捕获异常并进行相应的处理,从而避免业务逻辑的错误或者异常情况被忽略或者处理不当。
在下面码中,我们定义了一个BusinessException类,该类继承自RuntimeException,并在业务逻辑处理过程中,如果发生了业务异常,就通过throw语句抛出该自定义异常。
-
自定义一个运行时异常:
/** * 自定义的业务异常 */ public class BusinessException extends RuntimeException{ private final int code; private final String message; public BusinessException(int code, String message) { super(message); this.code = code; this.message = message; } public int getCode() { return code; } @Override public String getMessage() { return message; } } -
RestExceptionHandler加入自定义异常监控/** * 自定义业务异常 * @param e * @param <T> * @return */ @ExceptionHandler(BusinessException.class) public <T> DataResult<T> businessException(BusinessException e){ log.error("BusinessException:{}",e); return DataResult.fail(e.getCode(),e.getMessage()); } -
业务代码主动
throw异常@GetMapping("/test-business-erro") public String testBusinessException(@RequestParam String type){ // ... 业务逻辑处理过程 if("发生了业务异常"){ throw new BusinessException(ResponseCode.DATA_PARAM_ERROR.getCode(),ResponseCode.DATA_PARAM_ERROR.getMessage()); } return type; }