SpringMVC:异常处理机制与自定义异常处理

来源:互联网 发布:移动网络代理服务器 编辑:程序博客网 时间:2024/06/05 09:28

本节介绍SpringMVC的异常处理机制
首先介绍SpringMVC默认提供了一些HTTP错误类似码的默认异常处理
如何给一个Controller自定义异常处理
如何为项目做一个全局异常处理

提到异常处理,就不得不提HandlerExceptionResolvers,我们的DispatcherServlet默认设置三个异常处理器:

  • AnnotationMethodHandlerExceptionResolver:通过注解@ExceptionHandler实现异常理出
  • ResponseStatusExceptionResolver : 通过注解@ResponseStatus处理HTTP请求的状态码异常
  • DefaultHandlerExceptionResolver:处理Spring Exception并将其转换为HTTP响应状态码传送的客户端

SpringMVC默认处理的几种异常

Exception HTTP Status Code

BindException

400 (Bad Request)

ConversionNotSupportedException

500 (Internal Server Error)

HttpMediaTypeNotAcceptableException

406 (Not Acceptable)

HttpMediaTypeNotSupportedException

415 (Unsupported Media Type)

HttpMessageNotReadableException

400 (Bad Request)

HttpMessageNotWritableException

500 (Internal Server Error)

HttpRequestMethodNotSupportedException

405 (Method Not Allowed)

MethodArgumentNotValidException

400 (Bad Request)

MissingServletRequestParameterException

400 (Bad Request)

MissingServletRequestPartException

400 (Bad Request)

NoHandlerFoundException

404 (Not Found)

NoSuchRequestHandlingMethodException

404 (Not Found)

TypeMismatchException

400 (Bad Request)

MissingPathVariableException

500 (Internal Server Error)

NoHandlerFoundException

404 (Not Found)


首先介绍的是注解@ResponseStatus

@ResponseStatus

  • 用于自定义异常类上
  • 该异常属于某种HTTP错误状态码异常(或者说交由其处理)
    例如:我们自定义一个异常类:HttpStateCode404Exception,将其映射到404状态码

    异常类:HttpStateCode404Exception.java

/** *使用@ResponseStatus只能实现简单的提示 *当程序中抛出HttpStateCode404Exception会使用提示语:页面未找到 */@ResponseStatus(code=HttpStatus.NOT_FOUND,reason="页面未找到")public class HttpStateCode404Exception extends RuntimeException{    private static final long serialVersionUID = 1L;}

然后我们在一个Controller类处理/handleException/存在在的映射路径时的处理方法

@Controller@RequestMapping("handleException")public class HandleExceptionController {    /*@ExceptionHandler({Throwable.class})    public String handleThisController(){        return "/handleException/404";    }*/    @RequestMapping("{url}")    public void handle404(){        throw new HttpStateCode404Exception();    }}

细心的读者,一定会发现,我在上面注掉的代码使用了@ExceptionHandler注解
最终我们可以得到错误页面提示是这样的:好丑,但是有我们的reason
这里写图片描述
此方式只能实现简单的信息提示。
再来看看@ExceptionHandler
打开上面被注释掉的代码,你会发现我们的错误控制可以(转发)跳转页面了。
而且由于我们的这个方法定义在这个Controller类中,只要满足此@ExceptionHandler定义的异常都会走这个方法。
注意:是这个Controller类中所有请求出现异常,且异常被其包含
我希望定义一个全局异常处理呢???@ControllerAdvice
为我们实现处理所以的控制器Controllers的异常
具体实现

/** * 定义一个处理所有Controllers的ExceptionHandler */@ControllerAdvicepublic class GlobalExceptionAdvice {    @ExceptionHandler({HttpStateCode404Exception.class})    public String handleThisController(){        return "/handleException/404";    }    /*处理其他异常...*/}


异常处理的顺序:
1.Controller处理时抛出异常
2.本Controller类中的@ExceptionHandler如果捕获到,就执行其处理方法
3.否则,由全局异常捕获处理
4.否则,由@ResponseStatus注解的异常捕获处理
5.最后DefaultHandlerExceptionResolver处理
这恰恰也就是DispatcherServlet异常处理器的配置顺序(循序调用,List)

0 0
原创粉丝点击