【SpringMVC】SpringMVC中异常处理

news2024/11/20 9:35:27

1.异常处理的思路

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

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

2.实现步骤

2.1 编写异常类和错误页面

/**
* 自定义异常
*/
public class CustomException extends Exception {
    private String message;
    public CustomException(String message) {
    	this.message = message;
    }
    public String getMessage() {
    	return message;
    }
    
    public void setMessage(String message) {
        this.message = message;
    }
}

jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>执行失败</title>
    </head>
    <body>
    	执行失败!
    	${message }
    </body>
</html>

2.2 自定义异常处理器

/**
* 自定义异常处理器
*/
public class CustomExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response, 
                                         Object handler, Exception ex) {
        ex.printStackTrace();
        CustomException customException = null;
        //如果抛出的是系统自定义异常则直接转换
        if(ex instanceof CustomException){
        	customException = (CustomException)ex;
        }else{
        	//如果抛出的不是系统自定义异常则重新构造一个系统错误异常。
        	customException = new CustomException("系统错误,请与系统管理 员联系!");
        }
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message", customException.getMessage());
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

2.3 在springmvc.xml配置全局异常处理器

<!-- 配置自定义异常处理器 -->
<bean id="handlerExceptionResolver" class="cn.krislin.exception.CustomExceptionResolver"/>

3.异常测试

在controller、service、dao中任意一处需要手动抛出异常。如果是程序中手动抛出的异常,在错误页面中显示自定义的异常信息,如果不是手动抛出异常说明是一个运行时异常,在错误页面只显示“未知错误”。

  • 在商品修改的controller方法中抛出异常 .
public String editItems(Model model,@RequestParam(value="id",required=true) Integer items_id)throws Exception {

    //调用service根据商品id查询商品信息
    ItemsCustom itemsCustom = itemsService.findItemsById(items_id);

    //判断商品是否为空,根据id没有查询到商品,抛出异常,提示用户商品信息不存在
    if(itemsCustom == null){
		throw new CustomException("修改的商品信息不存在!");
    }

    //通过形参中的model将model数据传到页面
    //相当于modelAndView.addObject方法
    model.addAttribute("items", itemsCustom);

    return "items/editItems";
}
  • 在service接口中抛出异常:
public ItemsCustom findItemsById(Integer id) throws Exception {
    Items items = itemsMapper.selectByPrimaryKey(id);
    if(items==null){
        throw new CustomException("修改的商品信息不存在!");
    }
    //中间对商品信息进行业务处理
    //....
    //返回ItemsCustom
    ItemsCustom itemsCustom = null;
    //将items的属性值拷贝到itemsCustom
    if(items!=null){
        itemsCustom = new ItemsCustom();
        BeanUtils.copyProperties(items, itemsCustom);
    }

    return itemsCustom;
}
  • 如果与业务功能相关的异常,建议在service中抛出异常。
  • 与业务功能没有关系的异常,建议在controller中抛出。

上边的功能,建议在service中抛出异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

以前的互联网技术几乎是解决一切痛点和难题的万能解药

事实上&#xff0c;以往&#xff0c;我们所经历的那个互联网玩家频出的年代&#xff0c;其实就是一个以互联网技术为主导的年代。在那样一个年代里&#xff0c;互联网技术几乎是解决一切痛点和难题的万能解药&#xff0c;几乎是破解一切行业痛点和难题的杀手锏。任何一个行业&a…

怎么恢复删除的照片?分享5种恢复 iPhone /iPad 照片的方法

从 iPhone 中删除照片可能会带来压力。以下是如何使用几种不同的方法从 iPhone 恢复最近删除的照片。运气好的话&#xff0c;如果照片没有被新数据覆盖&#xff0c;您可以取回照片。 方法 1. 使用iPhone照片恢复工具 以下是如何使用图像恢复软件从 iPhone 中恢复已删除的图片&a…

字节跳动模型大规模部署实战

动手点关注干货不迷路1. 背景介绍在字节跳动&#xff0c;基于深度学习的应用遍地开花&#xff0c;工程师关注模型效果的同时也需要关注线上服务一致性和性能&#xff0c;早期这通常需要算法专家和工程专家分工合作并紧密配合来完成&#xff0c;这种模式存在比较高的 diff 排查验…

电磁兼容教程

------------------------20221228--------------------------------- 定义&#xff1a; 电磁环境&#xff0c;设备正常工作&#xff0c;不干扰其他设备。共存 电磁兼容研究 有限时间、空间、频谱设备共存的科学 要素&#xff1a; 电磁环境是由空间、时间、频谱三要素组成。…

怎么把word转化为PDF?赶快试试这个方法!

怎么把word转化为PDF&#xff1f;我们都经常会编辑文件、记录数据&#xff0c;所以也经常会需要转换文件的格式&#xff0c;word文件转换为PDF文件是最热的转换操作之一&#xff0c;所以有很多人都在问小编到底该怎样进行转换&#xff0c;不知道怎样转换出来的文件质量高&#…

18-剑指 Offer 20. 表示数值的字符串

题目 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格一个 小数 或者 整数&#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数若干…

Debian系列-开机启动程序

Debian系列-开机启动程序 文章目录Debian系列-开机启动程序摘要1 修改/etc/profile2 输入密码&#xff0c;以管理员权限运行程序关键字&#xff1a; 开机启动、 Debian、 Linux、 profile、 etc内容背景&#xff1a; 最近项目终于切到Linux下开发了&#xff0c;所以最近的记录…

sklearn.neighbors 最近邻相关算法,最近邻分类和回归

文章目录sklearn.neighbors 最近邻相关算法&#xff0c;分类和插值1. 查找最近邻元素2. 最近邻分类3. 最近邻回归4. NearestCentroid 最近邻质心分类5. Neighborhood Components Analysis 邻域成分分析sklearn.neighbors 最近邻相关算法&#xff0c;分类和插值 主要介绍 sklea…

day31【代码随想录】回溯之子集||、递增子序列、全排列、全排列||

文章目录前言一、子集 II&#xff08;力扣90&#xff09;二、递增子序列&#xff08;力扣491&#xff09;三、全排列&#xff08;力扣46&#xff09;四、全排列||&#xff08;力扣47&#xff09;总结前言 1、子集|| 2、递增子序列 3、全排列 4、全排列|| 一、子集 II&#xff…

【C++】指针的基础知识 | 学习笔记

文章目录前言一、指针的定义和使用1.1、指针定义1.2、指针使用二、指针占用的内存空间三、空指针和野指针3.1.空指针3.2 野指针四、const修饰指针4.1 常量指针4.2 指针常量4.3 const既修饰指针也修饰常量五、指针&#xff0c;数组&#xff0c;函数混用案例5.1 指针和数组混用5.…

Talk预告 | 上海交通大学计算机系博士生李杰锋方浩树:多人场景,全身136关键点检测与跟踪框架AlphaPose技术讲解

本期为TechBeat人工智能社区第466期线上Talk&#xff01; 北京时间12月28日(周三)20:00&#xff0c;上海交通大学计算机系博士生——李杰锋&方浩树的Talk将准时在TechBeat人工智能社区开播&#xff01; 他们与大家分享的主题是: “多人场景&#xff0c;全身136关键点检测与…

初识Unity

视频教程&#xff1a;史上最全Unity3D教程 常用快捷键 1.按住鼠标滚轮&#xff0c;拖动场景 2.滑动鼠标滚轮&#xff0c;缩放场景 3.右键&#xff0c;旋转视角 4.右键W、A、S、D&#xff0c;漫游视角&#xff0c;同时按下Shift可加速移动 5.alt鼠标左键&#xff0c;环视…

【财务】FMS财务管理系统---费用管理

在FMS财务管理系统中&#xff0c;和公司主营业务收入相关的费用有哪些&#xff1f;本篇文章中&#xff0c;笔者对具体分类和流程进行了系统的分析和总结&#xff0c;与大家分享。 财务中的费用管理主要包括销售费用、财务费用、管理费用等几大部分&#xff0c;看到费用大家首先…

C#,图像二值化(06)——全局阈值的大津OTSU算法及其源代码

1、大津OTSU算法 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的&#xff0c;是一种自适应阈值确定的方法&#xff0c;又叫大津法&#xff0c;简称OTSU&#xff0c;是一种基于全局的二值化算法&#xff0c;它是根据图像的灰度特性,将图像分为前景和背景两个部分。…

Git简介以及安装

目录 一、Git简介 1、版本控制系统简介 2、 Git的安装 a、安装git b、Git 的配置 二&#xff0c;本地仓库 三、GIT分支操作 1、关于分支 2. 分支基本操作 3、分支合并 4、冲突 一、Git简介 1、版本控制系统简介 版本控制系统&#xff08;VCS&#xff09;是将『什么…

【数据结构】直接插入排序,希尔排序,选择排序,堆排序

文章目录排序的概念直接插入排序希尔排序选择排序堆排序排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在…

keras环境搭建

目录 1. 安装miniconda 2. 安装CPU版本的tensorflow 2. 安装keras 3. 安装依赖库 4. 测试 环境&#xff1a;win10&#xff0c;无独立显卡&#xff0c;不用GPU加速。 1. 安装miniconda Miniconda3-latest-Windows-x86_64.exe &#xff08;1&#xff09;安装目录可自选&a…

生成对抗:Pix2Pix

cGAN : Pix2Pix 生成对抗网络还有一个有趣的应用就是&#xff0c;图像到图像的翻译。例如:草图到照片&#xff0c;黑白图像到RGB&#xff0c;谷歌地图到卫星视图&#xff0c;等等。Pix2Pix就是实现图像转换的生成对抗模型&#xff0c;但是Pix2Pix中的对抗网络又不同于普通的GAN…

计网第三章.数据链路层—可靠传输

以下来自湖科大计算机网络公开课的笔记 文章目录0.基本概念1. 停止等待协议SW2. 回退N帧协议GBN3. 选择重传SR首先&#xff0c;这部分说的可靠传输的实现机制不只限于数据链路层&#xff0c;而是适用于整个计算机网络体系 0.基本概念 一般情况下&#xff0c;有线链路的误码率…

Docker 中的挂载卷

我们现在有这样一个需求。 我们有一个 Spring 的项目是部署在容器中的&#xff0c;如果不进行任何配置的话&#xff0c;这个项目运行的所有日子都会在容器中。 当容器重启说着终止后&#xff0c;上面的日志比较难进行查看。 我们希望我们的日志同时也记录在操作系统中&#…