Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】

目录

一、单个控制器异常处理

1.1 控制器方法

1.2 编写出错页面

1.3 测试结果

二、全局异常处理

2.1 一个有异常的控制器类

2.2 全局异常处理器类

2.3 测试结果 

三、自定义异常处理器

3.1 自定义异常处理器

3.2 测试结果

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章

4. Spring MVC系列专栏文章   


一、单个控制器异常处理

在系统当中, Dao、Service、Controller层代码出现都可能抛出异常。如果哪里产生异常就在哪里处理,则会降低开发效率。所以一般情况下我们会让异常向上抛出,最终到达DispatcherServlet中,此时SpringMVC提供了异常处理器进行异常处理,这样可以提高开发效率

处理单个Controller的异常:

1.1 控制器方法

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {

    // 处理单个Controller异常
    @RequestMapping("/t1")
    public String t1(){
        String str = null;
        // str.length();
        // int flag = 1/0;
        int []arr = new int[1];
        arr[2] = 10;
        return "index";
    }

    /**
     * 异常处理方法
     * @param ex 异常对象
     * @param model 模型对象
     * @return
     */
    // 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
    @ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
    public String exceptionHandler1(Exception ex, Model model){
        // 向模型中添加异常对象
        model.addAttribute("msg",ex);
        // 跳转到异常页面
        return "error";
    }

    // 方法一不能处理的异常交给方法二处理
    @ExceptionHandler({java.lang.Exception.class})
    public String exceptionHandler2(Exception ex,Model model){
        model.addAttribute("msg",ex);
        return "error2";
    }
}

从控制器方法我们可以知道,如果出现算术错误类的话则返回错误页面1,否则都返回给错误页面2.。并且把错误信息传到前端。

1.2 编写出错页面

这里编写两个错误页面,为了是测试控制器是否成功知道出现的是哪一个错误。

错误页面1

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>出错了!</title>
</head>
<body>
<h3>ERROR 发生异常! ${msg}</h3>
</body>
</html>

严重错误页面2

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>出错了!</title>
</head>
<body>
<h3>ERROR2 发生严重异常! ${msg}</h3>
</body>
</html>

1.3 测试结果

OK,这里测试运行一下,上面的应该返回的是错误页面2,因为出现的错误是数组越界访问。

OK,我们再换一个错误,注释掉以下几行,再重新运行一遍是否跳到错误页面1,因为这里出现的算术错误。

OK,可以看到这里确实返回错误页面1出来了

二、全局异常处理

在控制器中定义异常处理方法只能处理该控制器类的异常,要想处理所有控制器的异常,需要定义全局异常处理类。如何体现这个全局异常处理呢,我们需要新建一个异常类,一个全局异常处理类,错误页面就按照上面两个即可。

2.1 一个有异常的控制器类

这里就用一个数组越界的错误类。

package com.example.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

// 编写另一个有异常的控制器类
@Controller
public class MyController2 {
    @RequestMapping("/t2")
    public String t1(){
        String str = null;
        // str.length();
        // int flag = 1/0;
        int []arr = new int[1];
        arr[2] = 10;
        return "index";
    }
}

2.2 全局异常处理器类

从控制器方法我们可以知道,如果出现算术错误类的话则返回错误页面1,否则都返回给错误页面2.。并且把错误信息传到前端。

package com.example.controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

// 全局异常处理类:添加@ControllerAdvice
@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 异常处理方法
     * @param ex 异常对象
     * @param model 模型对象
     * @return
     */
    // 添加@ExceptionHandler,表示该方法是处理异常的方法,属性为处理的异常类
    @ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})
    public String exceptionHandler1(Exception ex, Model model){
        // 向模型中添加异常对象
        model.addAttribute("msg",ex);
        // 跳转到异常页面
        return "error";
    }

    // 方法一不能处理的异常交给方法二处理
    @ExceptionHandler({java.lang.Exception.class})
    public String exceptionHandler2(Exception ex,Model model){
        model.addAttribute("msg",ex);
        return "error2";
    }
}

2.3 测试结果 

OK,访问路径:http://localhost:8080/t2

OK,确实和我们预料的一样,全局异常处理类发挥了作用。

三、自定义异常处理器

以上方式都是使用的SpringMVC自带的异常处理器进行异常处理,我们还可以自定义异常处理器处理异常:

3.1 自定义异常处理器

package com.example.controller;

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;

// 自定义异常处理器实现HandlerExceptionResolver接口,并放入Spring容器中
@Component
public class MyExceptionHandler implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        if(e instanceof NullPointerException){
            modelAndView.setViewName("error");
        }
        else {
            modelAndView.setViewName("error2");
            System.out.println("我自己的异常处理器");
        }
        modelAndView.addObject("msg",e);
        return modelAndView;
    }
}

3.2 测试结果

OK,为了体现自定义的异常处理器,我把全局异常处理器删除再重新启动服务器,访问上面那个有异常控制类。可以看到自定义异常处理类发挥了作用。

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

Maven系列专栏 Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏 MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章

Spring系列专栏 Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

4. Spring MVC系列专栏文章   

SpringMVC系列专栏 Spring MVC简介附入门案例
Spring MVC各种参数获取及获取方式自定义类型转换器和编码过滤器
Spring MVC获取参数和自定义参数类型转换器及编码过滤器
Spring MVC处理响应附案例详解
Spring MVC相关注解运用 —— 上篇

Spring MVC相关注解运用 —— 中篇

Spring MVC相关注解运用 —— 下篇
Spring MVC多种情况下的文件上传
Spring MVC异步上传、跨服务器上传和文件下载
Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】
Spring MVC拦截器和跨域请求
SSM整合案例【C站讲解最详细流程的案例】

猜你喜欢

转载自blog.csdn.net/qq_53317005/article/details/130535533
今日推荐