Spring MVC的高级功能——异常处理(二)自定义异常处理器

一、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执行时抛出的是系统自带的异常,异常处理页面统一打印“网络异常”。异常处理器对不同类型的异常进行区别处理。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BugPoet

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

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

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

打赏作者

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

抵扣说明:

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

余额充值