Spring-MVC异常处理
一般处理发生错误的方法
@RequestMapping(value = "/hello3.action")
protected String handleHello3(Model model,String username,int age) throws Exception {
System.out.println(username+"===="+age);
if ("myerror".equals(username)){
throw new MyError("发生了自定义异常");
}else if ("error".equals(username)){
throw new Exception("发生了通用异常");
}
//ModelAndView是model和view的合并体,model:用于请求之间传递参数的,类似于request。view:显示具体页面
//ModelAndView modelAndView = new ModelAndView();
model.addAttribute("username",username);//类似与request.setAttribute
model.addAttribute("age",age);
return "show";
}
XML文件里
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--通用异常 固定格式-->
<property name="defaultErrorView" value="commonError"/>
<property name="order" value="0"/><!--调整优先级-->
<!--中定义异常 自定义格式-->
<property name="exceptionMappings">
<props>
<prop key="com.etc.exception.MyError">myError</prop>
</props>
</property>
<!--异常信息-->
<property name="exceptionAttribute" value="ex"/>
</bean>
Spring MVC处理异常有3种方式:
•(1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
•(2)实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;
•(3)使用@ExceptionHandler注解实现异常处理
一、方法一
在XML文件里添加写的异常类
<!--全局异常处理器 方法一-->
<bean class="com.etc.exception.MyExceptionHandler"/>
异常类
package com.etc.exception;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/*
* 全局异常处理器
* */
public class MyExceptionHandler implements HandlerExceptionResolver, Ordered {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception ex) {
Map map = new HashMap<String,Exception>();
//异常信息
map.put("ex",ex);
//1、解析出异常类型
String viewName ="";
if(ex instanceof MyError)
{
//2、如果该异常类型是自定义的操作异常,直接获取异常信息,在错误页面展示
viewName = "myError";
}
else
{
//3、如果该异常类型不是自定义的操作异常,构建一个自定义的操作异常类型
viewName = "commonError";
}
//返回错误页面
return new ModelAndView(viewName,map);
}
//设置优先级
@Override
public int getOrder() {
return 0;
}
}
二、方法二
通过注解的方法
package com.etc.exception;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/*
* 全局异常处理器
* */
@Component
public class MyExceptionHandler implements HandlerExceptionResolver, Ordered {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception ex) {
Map map = new HashMap<String,Exception>();
//异常信息
map.put("ex",ex);
//1、解析出异常类型
String viewName ="";
if(ex instanceof MyError)
{
//2、如果该异常类型是自定义的操作异常,直接获取异常信息,在错误页面展示
viewName = "myError";
}
else
{
//3、如果该异常类型不是自定义的操作异常,构建一个自定义的操作异常类型
viewName = "commonError";
}
//返回错误页面
return new ModelAndView(viewName,map);
}
@Override
public int getOrder() {
return 0;
}
}
三、方法三
在同一个Controller里
•@ExceptionHandler注解
/*
* 第三种处理异常的方法
* 缺点:该方法要与发生异常的方法在同一个Controller类中
* 解决方法:可以通过继承的方法避免*/
@ExceptionHandler
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception ex) {
Map map = new HashMap<String,Exception>();
//异常信息
map.put("ex",ex);
//1、解析出异常类型
String viewName ="";
if(ex instanceof MyError)
{
//2、如果该异常类型是自定义的操作异常,直接获取异常信息,在错误页面展示
viewName = "myError";
}
else
{
//3、如果该异常类型不是自定义的操作异常,构建一个自定义的操作异常类型
viewName = "commonError";
}
//返回错误页面
return new ModelAndView(viewName,map);
}