异常处理
自定义异常处理的优势
自定义异常会让项目的异常处理更清晰,并且可以使异常携带业务相关的上下文信息,再配合自定义错误码,可以让异常的表达更清楚,也更容易排错。
自定义异常的实现
创建一个自定义异常类,并继承RuntimeException类,然后在类中定义 code(错误码)、message(也可以直接使用父类的message)
@Getter
public class BusinessException extends RuntimeException {
/**
* 异常码
*/
private final int code;
public BusinessException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
}
public BusinessException(ErrorCode errorCode, String message) {
super(message);
this.code = errorCode.getCode();
}
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
}
全局异常处理类
全局异常处理器能够捕获到程序中抛出的异常,并对这些异常进行统一的处理,从而避免因未处理异常导致系统崩溃或无法正常工作,这可以提高系统的稳定性。
具体应用
错误信息统一处理:可以将不同种类的异常统一格式,增强了用户的体验
错误日志记录:可以在全局异常处理中记录异常信息,包括异常的类型、发生时间、请求参数等,有助于排查问题和分析系统健康状况。
异常信息隐藏:可以隐藏敏感的信息,防止敏感信息泄露给用户。
具体实现:
首先定义一个全局异常处理类,让后使用 @RestControllerAdvice
注解该类,表示这是一个全局异常处理器类。
然后根据不同的异常,定义不同的处理方法,并且处理方法要用@ExceptionHandler(BusinessException.class)
,参数就是要处理的类.class,方法中写异常发生时要处理的内容,并返回一个响应对象,便于前端识别并给出用户友好的错误提示。、
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public BaseResponse<?> businessExceptionHandler(BusinessException e) {
log.error("businessException: " + e.getMessage(), e);
return ResultUtils.error(e.getCode(), e.getMessage());
}
@ExceptionHandler(RuntimeException.class)
public BaseResponse<?> runtimeExceptionHandler(RuntimeException e) {
log.error("businessException: " + e.getMessage(), e);
return ResultUtils.error(ErrorCode.SYSTEM_ERROR, e.getMessage());
}
}
评论区