设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Spring MVC异常解决

发布时间:2022-07-19 11:59 所属栏目:51 来源:互联网
导读:在 Spring MVC 应用的开发中,不管是操作底层数据库,还是业务层或控制层,都会不可避免地遇到各种可预知的、不可预知的异常。我们需要捕捉处理异常,才能保证程序不被终止。 Spring MVC 有以下 3 种处理异常的方式: 使用 Spring MVC 提供的简单异常处理器
  在 Spring MVC 应用的开发中,不管是操作底层数据库,还是业务层或控制层,都会不可避免地遇到各种可预知的、不可预知的异常。我们需要捕捉处理异常,才能保证程序不被终止。
 
  Spring MVC 有以下 3 种处理异常的方式:
  使用 Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver。
  实现 Spring 的异常处理接口 HandlerExceptionResolver,自定义自己的异常处理器。
  使用 @ExceptionHandler 注解实现异常处理
  1. @ExceptionHandler
  局部异常处理仅能处理指定 Controller 中的异常。
 
  示例 1:下面使用 @ExceptionHandler 注解实现。定义一个处理过程中可能会存在异常情况的 testExceptionHandle 方法。
  @RequestMapping("/testExceptionHandle")
  public String testExceptionHandle(@RequestParam("i") Integer i) {
      System.out.println(10 / i);
      return "success";
  }
  显然,当 i=0 时会产生算术运算异常。
 
  下面在同一个类中定义处理异常的方法。
  @ExceptionHandler({ ArithmeticException.class })
  public String testArithmeticException(Exception e) {
      System.out.println("打印错误信息 ===> ArithmeticException:" + e);
      // 跳转到指定页面
      return "error";
  }
  注意:该注解不是加在产生异常的方法上,而是加在处理异常的方法上。
 
  控制器输出结果如下。
  打印错误信息 ===> ArithmeticException:java.lang.ArithmeticException: / by zero
 
  @ExceptionHandler 注解定义的方法优先级问题:例如发生的是 NullPointerException,但是声明的异常有 RuntimeException 和 Exception,这时候会根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler 注解方法,即标记了 RuntimeException 的方法。
  被 @ExceptionHandler 标记为异常处理方法,不能在方法中设置别的形参。但是可以使用 ModelAndView 向前台传递数据。
 
  使用局部异常处理,仅能处理某个 Controller 中的异常,若需要对所有异常进行统一处理,可使用以下两种方法。
  2. HandlerExceptionResolver
  Spring MVC 通过 HandlerExceptionResolver 处理程序异常,包括处理器异常、数据绑定异常以及控制器执行时发生的异常。HandlerExceptionResolver 仅有一个接口方法,源码如下。
  public interface HandlerExceptionResolver {
      @Nullable
      ModelAndView resolveException(
              HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);
  }
  发生异常时,Spring MVC 会调用 resolveException() 方法,并转到 ModelAndView 对应的视图中,返回一个异常报告页面反馈给用户。
 
  示例 2:在 net.biancheng.exception 包中创建一个 HandlerExceptionResolver 接口的实现类 MyExceptionHandler,代码如下。
  package net.biancheng.exception;
  import java.util.HashMap;
  import java.util.Map;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import org.springframework.web.servlet.HandlerExceptionResolver;
  import org.springframework.web.servlet.ModelAndView;
  public class MyExceptionHandler implements HandlerExceptionResolver {
      @Override
      public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
              Exception arg3) {
          Map<String, Object> model = new HashMap<String, Object>();
          // 根据不同错误转向不同页面(统一处理),即异常与View的对应关系
          if (arg3 instanceof ArithmeticException) {
              return new ModelAndView("error", model);
          }
          return new ModelAndView("error-2", model);
      }
  }
  在 springmvc-servlet.xml 文件中添加以下代码。
  <!--托管MyExceptionHandler-->
  <bean class="net.biancheng.exception.MyExceptionHandler"/>
  再次访问 http://localhost:8080/springmvcDemo2/testExceptionHandle?i=0,页面跳转到 error.jsp 页面,运行结果如上图 1 所示。
  3. SimpleMappingExceptionResolver
  全局异常处理可使用 SimpleMappingExceptionResolver 来实现。它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常。

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读