[java/spring/web] 深入理解:Spring @ExceptionHandler => 自定义应用异常处理器(ApplicationExceptionHandler)
1 概述:Spring @ExceptionHandler ∈ spring-web
作用
- 
ExceptionHandler是 Spring 框架(spring-web模块)提供的一个注解,用于处理应用程序中的异常。
 当应用程序中发生异常时,ExceptionHandler将优先地拦截异常并处理它,然后将处理结果返回到前端。
 该注解可用于类级别和方法级别,以捕获不同级别的异常。
- 
在 Spring中使用ExceptionHandler非常简单,只需在需要捕获异常的方法上注解@ExceptionHandler,然后定义一个方法,该方法将接收异常并返回异常信息,并将该异常信息展示给前端用户。
注意事项
- Controller类下多个- @ExceptionHandler上的异常类型不能出现相同的;否则,运行时抛异常。
- @ExceptionHandler下方法返回值类型支持多种,常见的ModelAndView,@ResponseBody注解标注,ResponseEntity等类型都可以
2 应用场景
CASE : 基于 具体 Controller 的 异常捕获策略
@RestController
public class XxxxController {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception ex) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body("An error occurred: " + ex.getMessage());
    }
    @RequestMapping("/xxx/api")
    public String test() throws Exception {
        throw new Exception("Test exception!");
    }
}
CASE : 基于 @ControllerAdvice 的全局异常捕获策略(ApplicationExceptionHandler)
import xxx.common.exception.ApplicationException;
import xxx.model.dto.XResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice // controller 切面注解
public class ApplicationExceptionHandler {
    private final static Logger logger = LoggerFactory.getLogger(ApplicationExceptionHandler.class);
    //已知异常的捕获
    @ExceptionHandler(value = ApplicationException.class)   //表示当 ApplicationException 的异常被抛出时,执行此方法
    public XResponse handleApplicationException(ApplicationException exception){
        logger.error("Operation Fail! errorCode: {}, errorMessage: {}, cause : {}", exception.getErrorCode(), exception.getErrorMessage(),  exception.getCause());
        return XResponse.failure(exception.getErrorCode(), exception.getErrorMessage());
    }
    //未知异常
    @ExceptionHandler
    public XResponse handleOtherException(Exception e){
        //ModelAndView mv=new ModelAndView(); mv.addObject("tips","请稍后测试"); mv.setViewName("defaultError");
        logger.error("Operation Fail! errorMessage: {}, cause : {}", e.getMessage(),  e.getCause());
        XResponse response = XResponse.failure(null, e.getMessage());
        return response;
    }
    //@ExceptionHandler(Exception.class)
    //public ResponseEntity<String> handleException(Exception ex) {
    //    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
    //            .body("An error occurred: " + ex.getMessage());
    //}
}
X 参考文献
 
    
    本文作者:
        千千寰宇
    
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号