spring全局异常处理机制-秒懂

现如今与前台交互大多数采用restful api调用,而一个良好的异常处理机制,可进一步提高用户体验。

方法:

  • @ControllerAdvice,@ExceptionHander()
  • 在父类的baseController方法上加上@ExceptionHander()

代码实现:

1.@ControllerAdvice,@ExceptionHander()

创建一个全局异常类,类上添加@ControllerAdvice和@ResponseBody返回json参数。也可以单独使用@RestControllerAdvice。且spring会扫描到此注解,所以无需配置注入bean
在方法上添加@ExceptionHander(value = “需拦截异常的class”),可以单独拦截某一个异常,也可以全拦截Excepiton。

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public ResultBean allExceptionHandler(Exception ex){

    }

    @ExceptionHandler(value = 自定义异常.class)
    public ResultBean exceptionHandler(Exception ex){

    }

}
2.在父类的baseController方法上加上@ExceptionHander()

此方法与方法一类似,区别在于@ExcptionHander所在的类不一样。这个是在一个基类controller方法添加。
缺点在于每个controller必需继承基类baseController。

public class BaseController {
    @ExceptionHandler(value = Exception.class)
    public ResultBean allExceptionHandler(Exception ex){

    }
    @ExceptionHandler(value = 自定义异常.class)
    public ResultBean exceptionHandler(Exception ex){

    }

}

@RestController
public class TestController extends BaseController{

}

优化

现在拦截了所有异常的处理,还有一种错误也需要处理。就是Servlet出现的500,404等错误也需要拦截处理。

代码实现:

首先要在web.xml定义servlet出现的错误处理,location填写处理接口路径

    <error-page>
        <error-code>500</error-code>
        <location>/error/500</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/error/404</location>
    </error-page>

其次要在对应的controller进行自定义处理方法

@RequestMapping("error")
@RestController
public class ErrorController {

    @RequestMapping("/404")
    public ResultBean<String> handlerError404(){
        return new ResultBean<>(404,"找不到该页面");
    }

    @RequestMapping("/500")
    public ResultBean<String> handlerError500(){
        return new ResultBean<>(500,"服务器处理失败");
    }


}

待补充:

在springboot的servlet出现500的错误时是如何进行拦截出来的?

猜你喜欢

转载自blog.csdn.net/Yoga0301/article/details/80471973