18. Springmvc 处理异常

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。

系统的Dao、Service、Controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交 由异常处理器进行异常处理,如下图:

异常处理两种方式

1.使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver 

2.实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器

那么我们自己看看怎么用:

你可以先制造一点异常出来。

1. 见文生义  简单映射异常解析  啊哈哈:

这玩意是Springmvc自己有的,我们配置即可

现在我控制器 里面抛两个异常出去,分别是:

 一个是转换异常 (允许时异常) ,一个是我创建的异常(这里抛出)

然后我们配异常处理跳转:

我们直接在SpringMVC中配置文件xml中配一个bean:

 

    <!-- 配置异常处理器  -->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="error"/>   <!--这里已配置视图解析器-->
        <property name="exceptionMappings">      <!--这里配置异常处理 参数是个map集合,集合有很多可以抓的异常-->
            <map>
                <entry key="MyException" value="myerror"></entry>
                <entry key="java.lang.ClassCastException" value="error"></entry>
            </map>

        </property>
    </bean>

其中里面也说了:

bean是直接配 SimpleMappingExceptionResolver 的地址即可。

defaultErrorView  这个是默认异常,意思是说如果下面exceptionMappings中配置的异常都没有的话,就交给他跳转。【默认】

value 就代表要跳转的视图,为什么只写名字呢 因为我在配置文件中已配好 视图解析器

exceptionMappings 这个呢是添加异常处理,他的参数是个map 集合,集合可以装很多异常,key装的是异常、value 也就是跳转的视图。

很容易理解吧。  这个就这样写即可,直接配 很简单啊。

2.我们需要自己写接口 自己配置的 自己写逻辑

① 创建异常处理器类实现HandlerExceptionResolver

② 配置异常处理器

③ 编写异常页面

④ 测试异常跳转

这种方式其实看起来繁琐。。。。但是写起来 杠杠的:

package com.bihu;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Exception implements HandlerExceptionResolver {
    /***
     *
     *  实现这个接口,重写一个方法,参数如下:
      * @param request  :   普通Request 请求
     * @param response  :   普通Response响应
     * @param handler   :   对象 ,具体不知道是什么 应该和拦截器那个一样
     * @param ex        :   封装的内个异常
     * @return  返回的是一个ModelAndView  我们可携带数据 然后在跳转页面显示即可。
     */

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, java.lang.Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        //判断是什么异常 然后直接拦截到做响应操作
        if (ex instanceof NumberFormatException){
            modelAndView.addObject("info","对不起 出现了NumberFormatException异常!");
            modelAndView.setViewName("error");
        }else if (ex instanceof NullPointerException){
            modelAndView.addObject("info","对不起 出现了NullPointerException异常!");
            modelAndView.setViewName("error");
        }else{
            modelAndView.addObject("info","捕获到异常" + ex);
            modelAndView.setViewName("error");
        };
        
        //其实前两个都是自己判断异常
        //看的出 最后一个相当于第一种方式的内个default  默认
        
        
        return modelAndView;
    }
}

上面代码设置的视图 已配置视图解析器 。所以设置的视图只有名字,这点要知道即可。。。。

第二步我们直接在配置文件配置声明即可:

<!--直接配即可 非常的方便啊-->
<bean class="com.bihu.Exception"></bean>

第三步编写 错误的跳转视图

这里自己写 啊  我这里直接显示info即可:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>${info}</h2>
</body>
</html>

第四步 你自己测试 这里的结结果:

知识点就那么多  其实异常还是比较容易处理的,主要抓的到 ,什么都好说 对吧。

本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/15024975.html

原文地址:https://www.cnblogs.com/bi-hu/p/15024975.html