SpringMVC 异常处理

1.描述
      在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。
     那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的。下面将介绍使用Spring MVC统一处理异常的解决和实现过程。

2.分析
Spring MVC处理异常有3种方式:
(1) 使用@ExceptionHandler注解实现异常处理;
(2) 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;
(3) 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;

3.使用@ExceptionHandler注解实现异常处理
(1) 页面链接
<a href="${pageContext.request.contextPath}/testExceptionHandlerExceptionResolver?i=1" > testExceptionHandlerExceptionResolver </a >
(2) 控制器方法
package com.atguigu.springmvc.crud.handlers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class ExceptionHandler {
@RequestMapping("/testExceptionHandlerExceptionResolver")
public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i){
     System.out.println("10/"+i+"="+(10/i));
return "success";
}
}
(3) 测试,出现异常情况:处理异常,跳转到error.jsp

(4) 在控制器中增加处理异常的方法
@ExceprtionHandle(value={java.lang.ArithmeticException.class})
     public String handleException(Exception ex,Map<String,Object> map){
          System. out.println("出现异常啦L" +ex);
           //希望将Exception对象传递给页面,不能使用Map
          map.put( "exception",ex);
           return "error" ;
     }
(5) 增加error.jsp
<h3>Error Page</h3>
     说明1:通过以上map方法,在页面是无法获取错误消息的,如果想要获错误消息,需要使用一下内容;
@ExceptionHandler(value={java.lang.ArithmeticException.class})
     public ModelAndView handleException(Exception ex){
          System. out.println("出现异常啦L" +ex);
           ModelAndView mv = new ModelAndView("error" );
          mv.addObject( "exception", ex) ;
           return mv;
     }
${requestScope.exception }
      说明2:如果想要是的这个异常对所有的异常都起作用,就需要将这些异常提出来到一个类中,然后在类前面加入这个注解:@ControllerAdvice,具体做法如下:
package com.atguigu.springmvc.exhandler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class ExceptionAdviceHandler {

     @ExceptionHandler(value={java.lang.ArithmeticException.class})
     public ModelAndView handleException(Exception ex){
          System.out.println("出现异常啦"+ex);
          ModelAndView mv = new ModelAndView("error");
          mv.addObject("exception", ex) ;
          return mv;
     }

     @ExceptionHandler(value={java.lang.RuntimeException.class})
     public ModelAndView handleException2(Exception ex){
          System.out.println("RuntimeException-出现异常啦:"+ex);
          ModelAndView mv = new ModelAndView("error");
          mv.addObject("exception", ex);
          return mv;
     }
}
4. 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;
(1) 页面链接
< a href ="${pageContext.request.contextPath }/testResponseStatusExceptionResolver?i=10" >testResponseStatusExceptionResolver</a >
(2) 控制器方法
@ResponseStatus(value=HttpStatus.NOT_FOUND,reason="测试方法上设置响应状态码" )  //可有可无
     @RequestMapping(value= "/testResponseStatusExceptionResolver" )
     public String testResponseStatusExceptionResolver(@RequestParam ("i" ) int i){
           if(i==13){
               throw new UsernameNotMatchPasswordException();
          }
          System. out.println("testResponseStatusExceptionResolver..." );
          return "success" ;
     }
(3) 自定义异常类
package com.atguigu.springmvc.exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value=HttpStatus.FORBIDDEN,reason="用户名称和密码不匹配")
public class UsernameNotMatchPasswordException extends RuntimeException {
}
5. 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver
     如果希望对所有异常进行统一处理,可以使用 SimpleMappingExceptionResolver,它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常。
(1) 增加页面链接
<a href="testSimpleMappingExceptionResolver?i=12">testSimpleMappingExceptionResolver</a>
(2) 增加控制器方法
@RequestMapping("/testSimpleMappingExceptionResolver")
public String testSimpleMappingExceptionResolver(@RequestParam("i") int i){
     System.out.println("testSimpleMappingExceptionResolver...");
     String[] s = new String[10];
     System.out.println(s[i]);
     return "success";
}
(3) 出现异常情况:参数i的值大于10

(4) 配置异常解析器:自动将异常对象信息,存放到request范围内
<!-- 配置SimpleMappingExceptionResolver异常解析器 -->
<bean id="simpleMappingExceptionResolver"
 class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- exceptionAttribute默认值(通过ModelAndView传递给页面):exception   ->  ${requestScope.exception}
public static final String DEFAULT_EXCEPTION_ATTRIBUTE = "exception";
-->

<property name="exceptionAttribute" value="exception"></property>

<property name="exceptionMappings">
<props>
<prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop>
</props>
</property>

</bean>
       error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>Error Page</h3>
     ${exception }
     ${requestScope.exception }
</body>
</html>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Spring MVC中,可以通过以下几种方式来处理异常: 1. 使用@ControllerAdvice注解和@ExceptionHandler注解: - 首先,创建一个全局的异常处理类,使用@ControllerAdvice注解标注,并在类中定义一个或多个带有@ExceptionHandler注解的方法,用于处理特定的异常类型。 - 在异常处理方法中,可以定义需要执行的逻辑,例如记录日志、返回自定义错误信息等。 - 这种方式可以捕获并处理控制器中抛出的异常,提供统一的异常处理机制。 2. 使用@ExceptionHandler注解: - 在控制器类中,可以使用@ExceptionHandler注解标注方法,用于处理特定的异常类型。 - 这种方式适合处理控制器中的异常,可以针对不同的异常类型定义不同的处理逻辑。 3. 使用HandlerExceptionResolver接口: - 可以实现HandlerExceptionResolver接口,并注册为Spring的bean。 - 通过实现该接口的resolveException方法,可以自定义异常处理逻辑。 - 这种方式可以自定义异常处理的策略,例如根据异常类型、请求路径等进行不同的处理。 4. 使用@ControllerAdvice注解和@ModelAttribute注解: - 在全局异常处理类中,可以使用@ModelAttribute注解定义一个方法,用于在异常处理方法执行前,向模型中添加一些通用的属性。 - 这种方式适合在异常处理前,向模型中添加一些额外的信息,以便在异常处理方法中使用。 以上是几种常见的Spring MVC异常处理方式,根据具体的需求和场景,选择适合的方式进行异常处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员学习圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值