Spring中的@ExceptionHandler注解详解与应用😊
什么是@ExceptionHandler?🤔
`@ExceptionHandler`是Spring框架提供的一个强大注解,用于集中处理控制器(Controller)中抛出的异常。它可以帮助我们优雅地处理错误,避免将异常直接暴露给客户端。
```java
@ControllerAdvice
publicclassGlobalExceptionHandler{
@ExceptionHandler(Exception.class)
publicResponseEntityhandleException(Exceptionex){
returnResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("发生错误:"+ex.getMessage());
}
}
```
核心特性✨
1.异常类型匹配:可以指定处理的异常类型
2.返回值灵活:可以返回各种类型的响应
3.优先级机制:更具体的异常处理优先
```java
@ExceptionHandler({NullPointerException.class,IllegalArgumentException.class})
publicResponseEntityhandleSpecificExceptions(Exceptionex){
ErrorResponseerror=newErrorResponse("参数错误",ex.getMessage());
returnResponseEntity.badRequest().body(error);
}
```
实际应用场景🚀
1.统一错误响应格式:
```java
@ExceptionHandler(MethodArgumentNotValidException.class)
publicResponseEntityhandleValidationExceptions(
MethodArgumentNotValidExceptionex){
Listerrors=ex.getBindingResult()
.getFieldErrors()
.stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.toList());
returnResponseEntity.badRequest()
.body(newErrorResponse("验证失败",errors));
}
```
2.自定义业务异常处理:
```java
@ExceptionHandler(BusinessException.class)
publicResponseEntityhandleBusinessException(
BusinessExceptionex){
returnResponseEntity.status(ex.getHttpStatus())
.body(newErrorResponse(ex.getErrorCode(),ex.getMessage()));
}
```
最佳实践💡
-使用`@ControllerAdvice`创建全局异常处理器
-按异常类型分层处理
-记录异常日志
-返回用户友好的错误信息
```java
@ControllerAdvice
publicclassGlobalExceptionHandler{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)
publicResponseEntityhandleAllExceptions(Exceptionex,WebRequestrequest){
logger.error("发生未处理异常:",ex);
returnResponseEntity.internalServerError()
.body(newErrorResponse("SERVER_ERROR","系统繁忙,请稍后再试"));
}
}
```
通过合理使用`@ExceptionHandler`,我们可以大大提高应用的健壮性和用户体验!🎉
什么是@ExceptionHandler?🤔
`@ExceptionHandler`是Spring框架提供的一个强大注解,用于集中处理控制器(Controller)中抛出的异常。它可以帮助我们优雅地处理错误,避免将异常直接暴露给客户端。
```java
@ControllerAdvice
publicclassGlobalExceptionHandler{
@ExceptionHandler(Exception.class)
publicResponseEntityhandleException(Exceptionex){
returnResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("发生错误:"+ex.getMessage());
}
}
```
核心特性✨
1.异常类型匹配:可以指定处理的异常类型
2.返回值灵活:可以返回各种类型的响应
3.优先级机制:更具体的异常处理优先
```java
@ExceptionHandler({NullPointerException.class,IllegalArgumentException.class})
publicResponseEntityhandleSpecificExceptions(Exceptionex){
ErrorResponseerror=newErrorResponse("参数错误",ex.getMessage());
returnResponseEntity.badRequest().body(error);
}
```
实际应用场景🚀
1.统一错误响应格式:
```java
@ExceptionHandler(MethodArgumentNotValidException.class)
publicResponseEntityhandleValidationExceptions(
MethodArgumentNotValidExceptionex){
Listerrors=ex.getBindingResult()
.getFieldErrors()
.stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.toList());
returnResponseEntity.badRequest()
.body(newErrorResponse("验证失败",errors));
}
```
2.自定义业务异常处理:
```java
@ExceptionHandler(BusinessException.class)
publicResponseEntityhandleBusinessException(
BusinessExceptionex){
returnResponseEntity.status(ex.getHttpStatus())
.body(newErrorResponse(ex.getErrorCode(),ex.getMessage()));
}
```
最佳实践💡
-使用`@ControllerAdvice`创建全局异常处理器
-按异常类型分层处理
-记录异常日志
-返回用户友好的错误信息
```java
@ControllerAdvice
publicclassGlobalExceptionHandler{
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)
publicResponseEntityhandleAllExceptions(Exceptionex,WebRequestrequest){
logger.error("发生未处理异常:",ex);
returnResponseEntity.internalServerError()
.body(newErrorResponse("SERVER_ERROR","系统繁忙,请稍后再试"));
}
}
```
通过合理使用`@ExceptionHandler`,我们可以大大提高应用的健壮性和用户体验!🎉
899

被折叠的 条评论
为什么被折叠?



