springboot使用@ControllerAdvice和ErrorController实现全局异常控制。

个人见解

@ControllerAdvice + @ExceptionHandler是捕获异常进行处理,如果在方法内再次抛出异常,则会进入/error路径。
ErrorController相当于重定向到/error路径,然后对这个路径进行处理。

注:该方法无法处理未进入Controller的异常,比如404和Filter中的异常

1、@ControllerAdvice的实现

@ControllerAdvice可以根据不同的异常做出不同的反馈,如果不需要可以直接用ErrorController来处理所有异常。

@ControllerAdvice
@Slf4j	//lombok中的日志注解
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class) //不可预知的异常可以直接用Exception捕获
    public String exceptionHandler(HttpServletResponse response, Exception ex){
        log.error(ex.getMessage());
        //返回视图
        return "error";
    }

    @ExceptionHandler(NullPointerException.class) //可预知的异常可以单独处理,支持自定义异常。
    @ResponseBody 
    public ResultDTO nullPointerException(HttpServletResponse response){
    	//返回json
        return ResultUtil.error("空指针");
    }
}

2、无法被@ExceptionHandler捕获的异常可以由ErrorController处理

@Controller
public class CustomExceptionHandler implements ErrorController{
    @Autowired
    private ErrorAttributes errorAttributes;

    /**
     * 默认错误路径
     */
    private static final String ERROR_PATH = "/error";
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }

    @RequestMapping(ERROR_PATH)
    public String error(HttpServletRequest request, HttpServletResponse response) {
        //响应状态404 406 500这类
        int status = response.getStatus();
        //获取异常信息
        ServletWebRequest servletWebRequest = new ServletWebRequest(request);
        Map<String, Object> errorAttributes = this.errorAttributes.getErrorAttributes(servletWebRequest, true);
        //返回视图
        return "error2";
    }
}

捕获到的404异常
在这里插入图片描述
捕获到的RuntimeException
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200620001103410.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中,我们可以通过编写一个异常处理器来处理全局异常。这个异常处理器需要实现 Spring BootErrorController 接口,同时使用 @ControllerAdvice 和 @ExceptionHandler 注解来捕获异常和处理异常。 以下是一个简单的全局异常处理器的示例: ```java @ControllerAdvice public class GlobalExceptionHandler implements ErrorController { private static final String ERROR_PATH = "/error"; @RequestMapping(ERROR_PATH) public ResponseEntity<String> handleError(HttpServletRequest request) { HttpStatus status = getStatus(request); return new ResponseEntity<>("Error: " + status.getReasonPhrase(), status); } @Override public String getErrorPath() { return ERROR_PATH; } private HttpStatus getStatus(HttpServletRequest request) { Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if (statusCode != null) { return HttpStatus.valueOf(statusCode); } return HttpStatus.INTERNAL_SERVER_ERROR; } @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception e) { return new ResponseEntity<>("Error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 在上面的代码中,我们首先通过 @ControllerAdvice 注解将该类标记为全局异常处理器。然后,我们实现ErrorController 接口,并且在 getErrorPath 方法中返回了错误处理路径。接着,我们定义了一个 handleError 方法来处理错误,该方法首先获取错误状态码,然后返回一个 ResponseEntity 对象。最后,我们定义了一个 handleException 方法来处理所有的异常,该方法返回一个 ResponseEntity 对象。 使用上面的代码,我们就可以在 Spring Boot 应用中实现全局异常处理了。当应用发生异常时,我们就会调用 handleError 方法或 handleException 方法来处理异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值