gpt4 book ai didi

SpringMVC 异常处理机制与自定义异常处理方式

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 31 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章SpringMVC 异常处理机制与自定义异常处理方式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本节介绍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 。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
@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 。

SpringMVC 异常处理机制与自定义异常处理方式

此方式只能实现简单的信息提示.

再来看看@ExceptionHandler 。

打开上面被注释掉的代码,你会发现我们的错误控制可以(转发)跳转页面了.

而且由于我们的这个方法定义在这个Controller类中,只要满足此@ExceptionHandler定义的异常都会走这个方法.

注意:是这个Controller类中所有请求出现异常,且异常被其包含 。

我希望定义一个全局异常处理呢???@ControllerAdvice 。

为我们实现处理所以的控制器Controllers的异常 。

具体实现 。

?
1
2
3
4
5
6
7
8
9
10
11
/**
  * 定义一个处理所有Controllers的ExceptionHandler
  */
@ControllerAdvice
public class GlobalExceptionAdvice {
     @ExceptionHandler ({HttpStateCode404Exception. class })
     public String handleThisController(){
         return "/handleException/404" ;
     }
     /*处理其他异常...*/
}

异常处理的顺序

1.Controller处理时抛出异常 。

2.本Controller类中的@ExceptionHandler如果捕获到,就执行其处理方法 。

3.否则,由全局异常捕获处理 。

4.否则,由@ResponseStatus注解的异常捕获处理 。

5.最后DefaultHandlerExceptionResolver处理 。

这恰恰也就是DispatcherServlet异常处理器的配置顺序(循序调用,List) 。

自定义异常类(SpringMVC的异常处理)

SpringMVC当中的异常处理–自定义异常处理类 。

①:自定义异常类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class CustomerException extends Exception {
     //定义我们的异常信息
     private String exceptMsg;
     public CustomerException(String exceptMsg){
         this .exceptMsg = exceptMsg;
     }
     public String getExceptMsg() {
         return exceptMsg;
     }
     public void setExceptMsg(String exceptMsg) {
         this .exceptMsg = exceptMsg;
     }
}

②:自定义异常处理器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.jws.WebParam.Mode;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class CustomerExceptionResolver implements HandlerExceptionResolver {
     @Override
     public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {
         //通过我们自定义异常处理器,继承自HandlerExceptionResolver  来实现我们的异常处理
         //自定义我们的异常信息
         String  msg = "" ;
         //通过ModelAndView 来实现跳转到我们的错误页面,并且将错误信息带回到页面进行显示
         ModelAndView view = new ModelAndView();
         view.setViewName( "error" );
         //取出我们自定义的异常信息
         if (ex instanceof CustomerException){
             CustomerException exception = (CustomerException) ex;
             msg = exception.getExceptMsg();
         } else {
             //获取我们的stringWriter来获取我们的异常信息
             StringWriter writer = new StringWriter();
             PrintWriter printWriter = new PrintWriter(writer);
             //通过ex.printStackTrace(printWriter);来向我们的printWriter当中输入异常信息
             ex.printStackTrace(printWriter);
             msg = writer.toString();
         }
         //获取到异常信息之后,通过短信,邮件等技术,通知相关人员
         view.addObject( "msg" , msg);
         return view;
     }
}

③:配置我们的异常处理器

?
1
2
<!-- 申明我们的异常解析处理类-->
< bean id = "customerExceptionResolver" class = "cn.itcast.springmvc.exception.CustomerExceptionResolver" ></ bean >

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/qq_18675693/article/details/52317219 。

最后此篇关于SpringMVC 异常处理机制与自定义异常处理方式的文章就讲到这里了,如果你想了解更多关于SpringMVC 异常处理机制与自定义异常处理方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com