Spring MVC中如何对异常进行处理呢?
在SpringMVC开发中,我们难以避免出现一些异常错误现象的发生,那么我们如何在代码中捕捉异常呢?下文将一一道来,如下所示:
Spring MVC 拥有以下三种异常处理方法:
1.运用Spring MVC提供的简单异常处理器 SimpleMappingExceptionResolver。
2.自身实现一个Spring 的异常处理接口 HandlerExceptionResolver,自定义自己的异常处理器。
3.运用 @ExceptionHandler注解实现异常处理
@RequestMapping("/testException")
public String testExceptionHandle(@RequestParam("i") Integer i) {
System.out.println(10 / i);
return "ok";
}
/*
当我们输入参数0时,则会产生算数错误
*/
当我们在同一个类中定义处理异常的方法。
@ExceptionHandler({ ArithmeticException.class })
public String testArithmeticException(Exception e) {
System.out.println("打印错误信息 ===> ArithmeticException:" + e);
//跳转到错误的页面
return "error";
}
注意事项:SpringMVC的注解不是加在产生异常的方法上,而是加在处理异常的方法上
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>错误页面</title>
</head>
<body>
发生算术运算异常,请重新输出数据!
</body>
</html>
访问地址:http://localhost:8080/com.java265/testExceptionHandle?i=0,页面跳转到 error.jsp
控制台则会输出以下信息:
打印错误信息 ===> ArithmeticException:java.lang.ArithmeticException: / by zero
@ExceptionHandler 注解所在方法的优先级说明
如发生的是 NullPointerException,但是声明的异常有 RuntimeException 和 Exception,这时候会根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler 注解方法,
即标记了 RuntimeException 的方法。
被 @ExceptionHandler 标记为异常处理方法,不能在方法中设置别的形参。但是可以使用 ModelAndView 向前台传递数据。
使用局部异常处理,仅能处理某个 Controller 中的异常,若需要对所有异常进行统一处理,可使用以下两种方法
public interface HandlerExceptionResolver {
@Nullable
ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);
}
发生异常时,Spring MVC 会调用 resolveException() 方法,并转到 ModelAndView 对应的视图中,返回一个异常报告页面反馈给用户。
例: com.java265.exception 包中创建一个 HandlerExceptionResolver 接口的实现类 MyExceptionHandler,代码如下。
package com.java265.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 中配置bean
<!--托管MyExceptionHandler-->
<bean class="com.java265.exception.MyExceptionHandler"/>
再次访问 http://localhost:8080/com.java265/testExceptionHandle?i=0,页面跳转到 error.jsp 页面
在 springmvc-servlet.xml 中配置全局异常,代码如下。
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面,当该异常类型注册时使用 -->
<property name="defaultErrorView" value="error"></property>
<!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页名作为值 -->
<property name="exceptionMappings">
<props>
<prop key="ArithmeticException">error</prop>
<!-- 在这里还可以继续扩展对不同异常类型的处理 -->
</props>
</property>
</bean>
再次访问 http://localhost:8080/com.java265/testExceptionHandle?i=0,页面跳转到 error.jsp 页面
Spring MVC 拥有以下三种异常处理方法:
1.运用Spring MVC提供的简单异常处理器 SimpleMappingExceptionResolver。
2.自身实现一个Spring 的异常处理接口 HandlerExceptionResolver,自定义自己的异常处理器。
3.运用 @ExceptionHandler注解实现异常处理
一、 @ExceptionHandler
@RequestMapping("/testException")
public String testExceptionHandle(@RequestParam("i") Integer i) {
System.out.println(10 / i);
return "ok";
}
/*
当我们输入参数0时,则会产生算数错误
*/
当我们在同一个类中定义处理异常的方法。
@ExceptionHandler({ ArithmeticException.class })
public String testArithmeticException(Exception e) {
System.out.println("打印错误信息 ===> ArithmeticException:" + e);
//跳转到错误的页面
return "error";
}
注意事项:SpringMVC的注解不是加在产生异常的方法上,而是加在处理异常的方法上
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>错误页面</title>
</head>
<body>
发生算术运算异常,请重新输出数据!
</body>
</html>
访问地址:http://localhost:8080/com.java265/testExceptionHandle?i=0,页面跳转到 error.jsp
控制台则会输出以下信息:
打印错误信息 ===> ArithmeticException:java.lang.ArithmeticException: / by zero
@ExceptionHandler 注解所在方法的优先级说明
如发生的是 NullPointerException,但是声明的异常有 RuntimeException 和 Exception,这时候会根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler 注解方法,
即标记了 RuntimeException 的方法。
被 @ExceptionHandler 标记为异常处理方法,不能在方法中设置别的形参。但是可以使用 ModelAndView 向前台传递数据。
使用局部异常处理,仅能处理某个 Controller 中的异常,若需要对所有异常进行统一处理,可使用以下两种方法
二、 HandlerExceptionResolver
Spring MVC 通过 HandlerExceptionResolver 处理程序异常,如:处理器异常、数据绑定异常以及控制器执行时发生的异常。HandlerExceptionResolver 仅有一个接口方法public interface HandlerExceptionResolver {
@Nullable
ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);
}
发生异常时,Spring MVC 会调用 resolveException() 方法,并转到 ModelAndView 对应的视图中,返回一个异常报告页面反馈给用户。
例: com.java265.exception 包中创建一个 HandlerExceptionResolver 接口的实现类 MyExceptionHandler,代码如下。
package com.java265.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 中配置bean
<!--托管MyExceptionHandler-->
<bean class="com.java265.exception.MyExceptionHandler"/>
再次访问 http://localhost:8080/com.java265/testExceptionHandle?i=0,页面跳转到 error.jsp 页面
三、SimpleMappingExceptionResolver
全局异常处理可使用 SimpleMappingExceptionResolver 来实现。它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常。在 springmvc-servlet.xml 中配置全局异常,代码如下。
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面,当该异常类型注册时使用 -->
<property name="defaultErrorView" value="error"></property>
<!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常页名作为值 -->
<property name="exceptionMappings">
<props>
<prop key="ArithmeticException">error</prop>
<!-- 在这里还可以继续扩展对不同异常类型的处理 -->
</props>
</property>
</bean>
再次访问 http://localhost:8080/com.java265/testExceptionHandle?i=0,页面跳转到 error.jsp 页面
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。