SpringMVC异常处理

2023-11-17

为了统一处理代码运行过程中出现的异常,给用户一个更友好的异常界面,需要引入springMVC的异常处理功能,为了演示这个功能,本文实现一个比较常用的需求。

将所有的异常归为两类,一类是程序员自己创建的异常类,另一类是系统或框架定义的异常类。程序员自己定义的异常类在界面上输出异常信息,而系统定义好的异常全部统一输出“未知错误”。
引发异常后,跳转到异常页面,并且进行读秒,三秒后自动跳转到请求发生的页面,或者由程序员定义好的页面。

为了实现该功能,首先写一个自己的异常类,我这里命名为MyException,并且添加两个成员变量message和destination,分别表示异常信息和异常页面自动跳转的目标页面。
在其中添加getter、setter和构造方法,程序清单如下:

package com.elin4it.ssm.controller.exception;
/**
 * Description: MyException
 * Author: Elin Zhou
 * Create: 2015-07-04 13:49
 */
public class MyException extends Exception {
    private String message;
    //异常产生后跳转的位置,默认跳转到之前的页面
    private String destination;
    public MyException(){}
    public MyException(String message){
        super(message);
        this.message = message;
    }
    public MyException(String message,String destination) {
        super(message);
        this.destination = destination;
        this.message = message;
    }
    public String getDestination() {
        return destination;
    }
    public void setDestination(String destination) {
        this.destination = destination;
    }
    @Override
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

处理异常的功能,SpringMVC为程序员提供了HandlerExceptionResolver接口,只要实现其中的resolveException方法,即可以在异常发生时调用该方法处理异常。
所以创建一个类,使其实现resolveException接口,并添加

public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e)

方法。

对于具体异常的处理在此不再赘述,本文主要是为了介绍异常处理的流程,具体业务逻辑根据实际情况而定,这里只贴上为了完成上文需求而实现的代码。

package com.elin4it.ssm.controller.exception;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Description: MyExceptionResolver
 * Author: Elin Zhou
 * Create: 2015-07-04 13:49
 */
public class MyExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        MyException myException = null;
        if (e instanceof MyException){
            //如果接受到的异常为用户自定义的异常
            myException = (MyException)e;
        }else{
            //如果接受到的异常为其他系统定义的异常
            myException = new MyException(未知错误);
        }
        if (myException.getDestination()==null){
            //如果没有指定异常发生后的目标页面,则自动跳转到发起请求的页面
            //获取发起请求的完整路径,如https://localhost:8080/ssm/book/bookIndex
            String requestURL = httpServletRequest.getHeader(Referer);
            //根据'/'把路径分割
            String[] splitFromURL = requestURL.split(/);
            //得到分割后的子串数量
            int count = splitFromURL.length;
            //得到最后两端子串,并拼接成逻辑地址
            String destination = splitFromURL[count-2]+/+splitFromURL[count-1];
            myException.setDestination(destination);
        }
        ModelAndView modelAndView = new ModelAndView();
        //把异常传递到request中,用于界面输出的跳转
        modelAndView.addObject(exception,myException);
        modelAndView.setViewName(error);
        return modelAndView;
    }
}

上述代码实现的是根据参数判断异常是哪一类,如果是系统定义的则创建一个MyException,并且把message赋值为“未知错误”。然后判断其中的destination是否为null,如果是则将其赋值为用户发生请求的页面。然后将其赋值到ModelAndView中,然后返回。

最后,需要把异常处理器配置到springmvc中,在springmvc的配置文件中添加处理器类的注入。

不许要写id,也不需要配置其他信息,springmvc在装载bean到IOC容器时如果扫描到实现了HandlerExceptionResolver接口的类,则将其作为异常处理器。

最后贴上测试的controller方法和异常处理的jsp页面

@RequestMapping(/addBook)
public String addBook()throws Exception{
    //测试自定义异常
    if (1==1)
        throw new MyException(测试异常);
    //测试系统定义的异常
    int a = 10/0;
    return book/addBook;
}
<%--
  Created by IntelliJ IDEA.
  User: elin
  Date: 15-7-4
  Time: 下午1:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType=text/html;charset=UTF-8 language=java %>
<script type=text/javascript> function countDown(secs,surl){ var jumpTo = document.getElementById('jumpTo'); jumpTo.innerHTML=secs; if(--secs>0){ setTimeout(countDown(+secs+,'+surl+'),1000); } else{ location.href=surl; -ma } } </script>

${exception.message}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC异常处理 的相关文章

随机推荐

  • [蓝桥杯] 分数 (Python 实现)

    题目 代码 b 0 a 1 for i in range 0 20 b a a 2 print d d b a 2 结果 1048575 524288
  • C++案例

    目录 一 while循环猜数组 二 水仙花数 三 for循环敲桌子游戏 四 9 9乘法表 五 一维数组 元素逆置 六 冒泡排序 七 封装一个函数 利用冒泡排序 实现对整型数组的升序排序 八 结构体嵌套结构体 九 结构体排序 一 while循
  • 哈夫曼编码最大编码长度

    概念 层数 叶子节点为待编码的数据 根为第0层 编码长度 第 L L L层数据编码后的长度为 L L L 节点概率 若节点为叶子节点 则概率为叶子所编码数据的频率
  • Linux INPUT 子系统实验

    按键 鼠标 键盘 触摸屏等都属于输入 input 设备 Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件 输入设备本质上还是字符设备 只是在此基础上套上了 input 框架 用户只需要负责上报输入事件 比如按键值
  • Python3之异常with语句

    高级语法之异常with 语法 with 表达式1 as 变量1 表达式2 as 变量2 语句块 with的作用 使用于对资源进行访问的场合 确保使用过程中不管是否发生异常都会执行必须的 清理 操作 并释放资源 如 文件打开后自动关闭 线程中
  • 如何判断是否适合学编程?

    能问出这个问题的人 肯定是心里有点想学习编程 但是又担心自己不适合学习编程 学不会反而浪费时间 那么 如何判断自己是否适合学习编程呢 可以从如下几个方面入手 1 明确自己为什么要学编程 因为不同的编程语言适用的领域不一样 比如我认识一个做互
  • 使用COLMAP进行三维重构

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 COLMAP是什么 二 数据准备 2 1 数据采集 2 2 数据组织 三 重构 3 1 提取图像特征 3 2 特征点匹配 3 3 稀疏重建 SfM 3 4
  • QT开发遇到的问题(1)——程序循环执行的问题

    我之前一直直接用C 开发工程 有需求需要跨平台开发 前期使用时候感觉还可以 转到工程应用时候 就遇到好多坑 今天就遇到个大坑 在开发时候需要不断循环一块代码来实现某种功能 QT不像C 那种 这个更加专业 下面我对这个问题进行详细说明分析 问
  • ResultSet详解

    结果集 ResultSet 是数据中查询结果返回的一种对象 可以说结果集是一个存储查询结果的对象 但是结果集并不仅仅具有存储的功能 他同时还具有操纵数据的功能 可能完成对数据的更新等 结果集读取数据的方法主要是getXXX 他的参数可以是整
  • docker 入门指南

    docker Docker is an open platform for developing shipping and running applications Docker enables you to separate your a
  • Matlab零基础入门

    前言 本篇是随笔 一段时间没用Matlab 简单复习了下 都是入门知识 零基础可读 文章目录 1 初步认识界面和命名 2 数据类型和矩阵 3 元胞数组和结构体 3 1 元胞数组 3 2 eye 3 3 3 magic 3 4 结构体 4 矩
  • RNA-seq——学习路线、学习经验、实战项目、学习总结

    1 参考课程和博客 B站 RNA seq转录组数据分析入门实战 生信技能树 转录组测序数据分析 简书 RNA seq 1 用conda安装RNA seq所需要的工具 简书 RNA seq 2 1 原始数据下载的几种方法 简书 RNA seq
  • python接口自动化(三)--如何设计接口测试用例(详解)

    简介 上篇我们已经介绍了什么是接口测试和接口测试的意义 在开始接口测试之前 我们来想一下 如何进行接口测试的准备工作 或者说 接口测试的流程是什么 有些人就很好奇 接口测试要流程干嘛 不就是拿着接口文档直接利用接口 测试工具测试嘛 其实 如
  • 开发EduSoho v8.7.10 本地播放视频超时或者快进后网络错误导致视频下载中途失败。鉴权播放次数问题

    EduSoho v8 7 10 本地播放视频超时或者快进后网络错误导致视频下载中途失败 鉴权播放次数问题 文件路径 src AppBundle Twig WebExtension php protected function makeTok
  • CFileDialog 多文件选择注意事项

    当选择文件数量比较多的时候 发现CFileDialog返回文件名并不完整 翻阅MSDN发现文件名长度是有限制的 解决思路 CFileDialog dlgOpen TRUE T txt NULL OFN HIDEREADONLY OFN RE
  • 【转】游戏汉化之Tile全格式解读 by 阿一

    最近在破解一些图片的格式 并想导出PNG 不过老是记不住bpp的格式 转载之 方便查看 做些锚记 标准1BPP NDS 1BPP 标准2BPP VB 2BPP NGP 2BPP NES 2BPP 1BPP 1BPP GB 2BPP 1BPP
  • SpringCloud2架构图

    先来个简洁版 1 外部或者内部的非Spring Cloud项目都统一通过API网关 Zuul 来访问内部服务 zuul是对外暴露的唯一接口相当于路由的是controller的请求 2 网关接收到请求后 从注册中心 Eureka 获取可用服务
  • Unity泛光效果消失问题

    关于Unity泛光效果消失问题解决过程 问题描述 第一次尝试解决 第二次尝试解决 第三次尝试解决 问题描述 之前一直在做的一个项目 在一次想要添加UI泛光效果失败后 发现项目中已有的泛光效果也消失了 第一次尝试解决 因为问题是在添加插件Po
  • linux服务器编译报错:DSO missing from command line原因及解决办法

    报错信息提示包含以下两行 undefined reference to symbol libfastrtps so 1 error adding symbols DSO missing from command line 原因 提示说符号没
  • SpringMVC异常处理

    为了统一处理代码运行过程中出现的异常 给用户一个更友好的异常界面 需要引入springMVC的异常处理功能 为了演示这个功能 本文实现一个比较常用的需求 将所有的异常归为两类 一类是程序员自己创建的异常类 另一类是系统或框架定义的异常类 程