[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 参考文献

posted @ 2024-10-13 22:31  千千寰宇  阅读(15)  评论(0编辑  收藏  举报