SpringMVC---- SpringMVC异常处理机制

上一篇👉:SpringMVC---- SpringMVC拦截器



🚴大家好!我是近视的脚踏实地,后边这系列是自己自学Spring框架的学习笔记,这篇文章学习关于SpringMVC 异常处理机制的 相关知识
     唯有行动  才能解除你所有的不安

1. SpringMVC异常处理机制

(原先的我们的异常在开发时都是自己手动地try catch,那么try catch本身是有一些缺点的,学习SpringMVC异常处理机制可以避免这些缺点)
(在基础阶段,web阶段等等我们处理异常基本都是大同小异,都是在业务层进行try catch,抓完之后一般就在控制台打印语句,其实在真正的实际开发当中,我们抓到的这个异常是要做相应的处理操作的,比如把异常信息存到数据库当中,或者存到日志当中等等。

那么在业务层try catch它有什么弊端呢?第一个弊端在于抓异常的try catch动作跟我们的业务代码就耦合在一起了。第二个弊端就是同一个类型的异常在整个系统当中可能都抛很多个,然后抓住异常后很有可能就是要做相同的工作,所以在java当中我们有一种思想叫做抽取思想。那么我们能不能把解决异常的这个功能再单独把它抽取一下,换句话 比如说抛出类型转换异常,那么我就让某个组件帮我们进行异常处理,如果是抛文件找不到,我也单独使用一个组件处理文件找不到的这个异常)

1.1 异常处理的思路

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。
(预期异常就是必须要try,必须要处理的异常的,在编译器就通过不了,运行时异常就是运行当中才发现的异常或错误)

系统的Dao,Service,Controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,如下图:
(原先系统Dao层,Service层,Controller层都会出现异常,原先是在业务层上进行处理,而现在是依次往上抛,Dao层抛给业务层,业务层抛给web层,那么抛给web层干嘛呢,大家想想,因为最终Controller层是SpringMVC框架帮我们调用的,那在帮我调用时,我如果有异常了,再抛,那就是抛给框架处理了。最后就是由SpringMVC这个前端控制器帮我们进行一个异常的处理,SpringMVC这个前端控制器可以认为是一个组件,除了这个组件之外,SpringMVC还提供了一个异常处理器这么一个组件,可以让他统一帮我们进行一个异常的操作)
在这里插入图片描述
(当抛到前端控制器的时候,前端控制器就会找到一个能处理这个异常的一个组件,比如异常处理器, SpringMVC本身已经为我们定义好一些异常处理器了,如果不想用,也可以自己自定义。那么处理就可以做相应的逻辑操作,代码操作,比如说把异常信息存到日志当中,与此同时,存完后可以让他跳转到一个错误页面,每次报错报500,一些英文,对于用户就不是很友好。那么就可以给个友好提示。)

1.2 异常处理的两种方式

● 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver
(它主要的作用就是,当你报异常的时候,就告诉它,比如报了角标越界的异常,那么它就给你跳转到一个错误页面,如果你报了一个类型转换异常,那就给你跳到一个错误2页面,如果你报了一个自定义异常,就给你跳到一个错误3页面,那么其实他就是一种异常跟你要跳转页面的一种映射关系的简单映射异常处理器。它是SpringMVC提供的,但是我们得配置)

● 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器
(上边那个是人家定义好的,我们需要配置,第二个就是不用他的,而是自己去实现一个。自定义意味着这个异常怎么处理就是我们自己说了算了。内部就可以做相应的代码操作。

1.3 简单异常处理器SimpleMappingExceptionResolver

SpringMVC已经定义好了该类型转换器,在使用时可以根据项目情况进行相应异常与视图的映射配置,那么就需要在配置文件中做如下的配置👇:
(那么它主要配的就是异常与视图映射配置,比如说报转化异常,就往一个A视图跳,报的是角标越界,就往B视图跳。所以它是异常类型与你的错误视图的映射配置)
在这里插入图片描述
(上边就是在spring-mvc.xml中配置的,首先配置一个bean,这个bean就是SimpleMappingExceptionResolver,然后内部进行注入配置,首先是<property name=“defaultErrorView” value=“error”/>,默认的一个错误视图,后边那个value指的就是视图的名称,不一定要叫error,可以自己定。因为我这里前边已经配置了内部资源解析器了,所以可以直接写视图名称就可以了。这句话的含义就是,如果你现在返回的异常跟我一会下边配的异常都不匹配时,最终才会走这条语句,下边的就是exceptionMappings,异常映射们,可以配很多个异常。)

那么接下来可以用代码来实现一下,首先说下实验的环境,在service层有个DemoServiceImpl,里边是故意制造出来的各种异常

public class DemoServiceImpl implements DemoService {
    public void show1() {
        System.out.println("抛出类型转换异常....");
        Object str = "zhangsan";
        Integer num = (Integer)str;
    }

    public void show2() {
        System.out.println("抛出除零异常....");
        int i = 1/0;
    }

    public void show3() throws FileNotFoundException {
        System.out.println("文件找不到异常....");
        InputStream in = new FileInputStream("C:/xxx/xxx/xxx.txt");
    }

    public void show4() {
        System.out.println("空指针异常.....");
        String str = null;
        str.length();
    }

    public void show5() throws MyException {
        System.out.println("自定义异常....");
        throw new MyException();
    }
}

然后在web层有个DemoController,用来测试的,然后还有其他一些配置文件的相关配置,注解驱动等等

@Controller
public class DemoController {

    @Autowired
    private DemoService demoService;

    @RequestMapping(value = "/show")
    public String show() throws FileNotFoundException, MyException {
        System.out.println("show running......");
        demoService.show1();
        //demoService.show2();
        //demoService.show3();
        //demoService.show4();
        //demoService.show5();
        return "index";
    }

}

那么首先在没有对异常做任何处理操作的时候,先运行项目去访问controller的show方法👇:,发现就会报500的错误,这个500错误就是类转换异常,那么如果这样展示给用户,对用户就很不友好,我们就可以做相应处理,比如服务器访问不了,就可以给个网络繁忙等等友好提示
在这里插入图片描述

那么下面就来实现异常的处理,那么久是去sping-mvc.xml中进行配置👇:
在这里插入图片描述

接着把对应的error界面创建出来

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>通用的错误提示页面</h1>
</body>
</html>

然后重新启动服务器再次访问,错误还在,只不过他给你跳转到了刚刚写的页面,这个页面当然以后可以设计得好看一些。
在这里插入图片描述
接着来配置exceptionMappings异常映射们,里边需要一个map标签,里边可以配很多异常,比如刚刚我们那里的类转换异常,捕捉到就往error1进行跳转,再对应地创建出跳转的视图👇:
在这里插入图片描述
然后重新启动服务器再次访问,因为在Controller中调用的是show1,所以应该会跳到类转化异常对应的错误视图👇:
在这里插入图片描述
如果调用show5,自定义异常,就会相应调用自定义异常对应的错误视图👇:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.4 自定义异常处理步骤

1️⃣:创建异常处理器类实现HandlerExceptionResolver
(需要重写的放有一个,resolveException方法,翻译成中文叫处理异常,在方法当中,可以看到我们很熟悉的参数Request,Response,Exception,那么抛异常了,它就会把异常对象给你封装到这,我们就可以在这拿到这个异常对象,然后判断是不是自己想要的异常。不同的异常就可以进行不同的操作,最后返回的是一个modelAndView,就是你要跳转的视图 )

public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        //判断拿出来的异常是不是我们自己自定义的异常
        if(e instanceof MyException){
            modelAndView.addObject("info","自定义异常");
        }else if(e instanceof ClassCastException){
            modelAndView.addObject("info","类型转换异常");
        }

        modelAndView.setViewName("error");
        return modelAndView;
    }
}

2️⃣:配置异常处理器
在这里插入图片描述

3️⃣:编写异常页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>通用的错误提示页面</h1>
    <h1>${info}</h1>
</body>
</html>

4️⃣:测试异常跳转
在这里插入图片描述
(通过这个我们就可以发现,不管是用Spring帮我们定义好的,还是自定义的,我们都能把异常和我们的具体业务区分开,所以以后在代码当中,大部分情况下再有异常就往上抛,直到web层还往上抛。因为你已经定义并配置异常处理器,由他们去接管异常相应的操作,就是解耦的思想)

1.5 知识要点

异常处理方式
● 配置简单异常处理器SimpleMappingExceptionResolver
● 自定义异常处理器

自定义异常处理步骤

1️⃣:创建异常处理器类实现HandlerExceptionResolver
2️⃣:配置异常处理器
3️⃣:编写异常页面
4️⃣:测试异常跳转

相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页