一、resolveException()方法
除了使用SimpleMappingExceptionResolver进行异常处理,还可以自定义异常处理器统一处理异常。通过实现HandlerExceptionResolver接口,重写异常处理方法resolveException()来定义自定义异常处理器。当Handler执行并且抛出异常时,自定义异常处理器会拦截异常并执行重写的resolveException()方法,该方法返回值是ModelAndView类型的对象,可以在ModelAndView对象中存储异常信息,并跳转到异常处理页面。
接下来通过一个案例演示自定义异常处理器分类别处理自定义异常和系统自带的异常,具体实现步骤如下所示。
1、创建自定义异常类MyException。
public class MyException extends Exception {
private String message; // 异常信息
public MyException(String message) {
super(message);
this.message = message; }
@Override
public String getMessage() {return message;}
public void setMessage(String message) {this.message = message;}
}
2、修改文件ExceptionController.java,在ExceptionController类中,新增方法addData()用于抛出自定义异常,addData()方法的具体代码如下所示。
@RequestMapping("addData")
public void addData() throws MyException {
throw new MyException("新增数据异常!");
}
3、创建名称为MyExceptionHandler的自定义异常处理器,方法中重写resolveException()方法。MyExceptionHandler类的部分代码如下所示。
import com.itheima.exception.MyException;
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.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
@Component
public class MyExceptionHandler implements HandlerExceptionResolver {
/**
* @param request 当前的 HTTP request
* @param response 当前的 HTTP response
* @param handler 正在执行的Handler
* @param ex handler执行时抛出的exception
* @return 返回一个ModelAndView
*/
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
// 定义异常信息
String msg;
//如果是自定义异常,将异常信息直接返回
if (ex instanceof MyException) {
msg = ex.getMessage();
} else {
// 如果是系统的异常,从堆栈中获取异常信息
Writer out = new StringWriter();
PrintWriter s = new PrintWriter(out);
ex.printStackTrace(s);
//系统真实异常信息,可以以邮件,短信等方式发给相关开发人员
String sysMsg = out.toString();
//向客户隐藏真实的异常信息,仅发送友好提示信息
msg = "网络异常!";
}
// 返回错误页面,给用户友好页面显示错误信息
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", msg);
modelAndView.setViewName("error.jsp");
return modelAndView;
}
}
4、创建一个名称为error.jsp的文件,用作异常处理页面。本案例不对异常处理页面进行过多处理,只将异常信息打印在页面上。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>异常处理页面</title></head>
<body>
${msg}
</body>
</html>
5、启动chapter13项目,在浏览器中访问地址http://localhost:8080/chapter13/showNullPointer,程序将执行showNullPointer()方法。
6、在浏览器中访问地址http://localhost:8080/chapter13/addData,程序将执行addData()方法。
如果Handler执行时抛出的是自定义异常,异常处理页面打印自定义异常的异常信息;如果Handler执行时抛出的是系统自带的异常,异常处理页面统一打印“网络异常”。异常处理器对不同类型的异常进行区别处理。