ssm异常处理

news2025/2/28 23:30:12

ssm异常处理

类上和方法上都要有注解:

类上的注解: 异常处理用到的注解,里面包含了其他的一些必须的注解,详解看下图
在这里插入图片描述
方法上的注解:
在这里插入图片描述

上面的要懂打配合
现在创建一个处理异常的工具类,加上前面提到的注解,将所有的异常拦截下来,统一处理:注意下面的注释,详细讲述了传进来参数等等都是怎样的,这里的返回值别和控制类的返回值搞混了,两者没有关系

package com.itjh.contorller;

import com.itjh.excption.SystemException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

//这个注解自动包含了@ResponseBody和@Component
@RestControllerAdvice
public class Throw {
    //抓住哪种异常类型
    @ExceptionHandler(Exception.class)
    //捕获的是传过来的异常,比如serv类中抛出的异常
    //所以传过来的,和这里收到的是同一个异常的对象
    public Result excption(Exception e){
    	//打印在控制台上,我自己要看的
    	System.out.println("异常发生了,吃俺老孙一棍");
    	//这里的返回值是返回给前端的
    	return new Result(Code.GET_NO,null,"呔!异常妖精哪里跑!!!");
    }
}

控制类:下面的应该是算数异常,所以属于Exception异常,刚好和上面代码中的方法的异常参数相对应,也可以说上面方法中的参数就是下面这个算数异常

package com.itjh.contorller;

import com.itjh.excption.SystemException;
import com.itjh.pojo.Book;
import com.itjh.service.ServiceImp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("users")
public class serv {

    @Autowired
    private ServiceImp serviceImp;

    @GetMapping()
    //将返回值自动变成了json格式:集合中为
    // pojo类的json格式就是  键名:[{a:b],{c:d}]
    public Result getAll() throws SystemException{
 			int i=1/0;
        	List<Book> books=serviceImp.selectAll();
        	Integer code=books!=null?Code.GET_OK:Code.GET_NO;
        	String mes=books!=null?"小飞棍来喽":"出错啦,宝";
        	//如果没有发生异常就会将数据返回给前端
        	return new Result(code,books,mes);
    }
 }

异常所属的类型有很多:

所以自己给他分个类,分为业务层很多种:
在这里插入图片描述
相对应的解救方法:
在这里插入图片描述
先摆出下面代码需要的回应数值:

package com.itjh.contorller;

public class Code {
	//未发生异常时,正常操作的成功与否的回应值
    public static final Integer SAVE_OK=42021;
    public static final Integer DELETE_OK=42023;
    public static final Integer GET_OK=42025;
    public static final Integer GETBYID_OK=42027;
    public static final Integer UPDATE_OK=42029;

    public static final Integer SAVE_NO=42020;
    public static final Integer DELETE_ONO=42022;
    public static final Integer GET_NO=42024;
    public static final Integer GETBYID_NO=42026;
    public static final Integer UPDATE_NO=42028;

    //自定义的不同异常所需要的回应值
    public static final Integer bUSINESS_OK=5001;
    public static final Integer SYSTEM_OK=5003;
    public static final Integer SYSTEM_NO=5000;
    public static final Integer bUSINESS_NO=5002;
}

根据上面第二张图大致可以分析出来三种自定义类型的异常,于是创建自定义异常:令其继承Throwable即可:三个自定义异常

业务异常:

package com.itjh.excption;

public class BusinessExcption extends Throwable{
    Integer code;

    public BusinessExcption(Integer code,String message) {
        super(message);
        this.code=code;
    }

    public BusinessExcption(Integer code,String message, Throwable cause) {
        super(message, cause);
        this.code=code;
    }
}

系统异常:

package com.itjh.excption;

public class SystemException extends RuntimeException{
    Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public SystemException(Integer code , String message) {
        super(message);
        this.code=code;
    }

    public SystemException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code=code;
    }
}

之后,在控制类再抛出异常的时候就可以按照规矩,抛上面这几种异常:

  • 这里的例子,抛异常SystemException里面的参数是codemessagecode是在自定义异常SystemException两个参数的构造函数中传了的,于是在异常处理工具类中的返回值的位置,在里面参数就是直接通过getCode()方法获得参数code了,而message会发现没有getMessage()方法,从而在异常处理工具类中无法获得message值,但是其实和code一样通过构造含数传递的,只是没有定义getMessage()方法,但是异常的父类Throwable中有这个get()方法,我把参数已经通过构造函数传上去了,限制只需要调用其父类的getMessage()方法即可,因为继承的关系,子类可以调用父类独有的东西
  • 下面两个代码就是控制类传参,和,异常处理工具类:
package com.itjh.contorller;

import com.itjh.excption.SystemException;
import com.itjh.pojo.Book;
import com.itjh.service.ServiceImp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("users")
public class serv {

    @Autowired
    private ServiceImp serviceImp;

    @GetMapping()
    //将返回值自动变成了json格式:集合中为
    // pojo类的json格式就是  键名:[{a:b],{c:d}]
    public Result getAll() throws SystemException{
        try{
            int i=1/0;
        }
        //当前异常是哪种异常,这里除以0,自然是算数异常
        catch (ArithmeticException excption){
            //知道发生了异常,就做一些补救措施
            //脑子里判断出她应该属于系统类错误,
            //所以选择对应的自定义异常
            throw new SystemException(Code.GET_NO,"出错啦!!!");
        }
        List<Book> books=serviceImp.selectAll();
        Integer code=books!=null?Code.GET_OK:Code.GET_NO;
        String mes=books!=null?"小飞棍来喽":"出错啦,宝";
        return new Result(code,books,mes);
    }
    
	@DeleteMapping("/{id}")
    public Result delect(@PathVariable int id) throws BusinessException {
    	//传进来的如果id为1则抛出异常,
        //让异常处理工具类抓住他
        if(id==1){
            System.out.println("要抛出业务异常喽!!!");
            throw new BusinessException(Code.bUSINESS_NO,"输入的id有误,请重新输入!!!");
        }
        
        boolean flag=serviceImp.delete(id);
        String mes=flag==true?"成功删除了了呢!!":"搞错啦";
        Integer code=flag==true?Code.UPDATE_OK:Code.UPDATE_NO;
        return new Result(code,flag,mes);
    }
}

然后再看拦截异常的工具类:

里面方法的参数就是:控制类抛出的异常,被拦截下来后,放进了方法的参数中。根据异常的不同应当对应的方法有三种才对:这里就写了两种看看就行了

package com.itjh.contorller;

import com.itjh.excption.BusinessException;
import com.itjh.excption.SystemException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

//这个注解自动包含了@ResponseBody和@Component
@RestControllerAdvice
public class Throw {
    //抓住哪种异常类型
    @ExceptionHandler(SystemException.class)
    //捕获的是传过来的异常,比如serv类中抛出的异常
    //参数就是控制类传过来的异常参数
    public Result systemExcption(SystemException e){
        //打印在控制台上,我自己要看的
        System.out.println("异常发生了,吃俺老孙一棍");
        //作为json格式返回给前端
        return new Result(e.getCode(),null, e.getMessage());
    }

    //抓住哪种异常类型
    @ExceptionHandler(BusinessException.class)
    //捕获的是传过来的异常,比如serv类中抛出的异常
    //参数就是控制类传过来的异常参数
    public Result businessExcption(BusinessException e){
        //打印在控制台上,我自己要看的
        System.out.println("异常发生了,吃俺老孙一棍");
        //作为json格式返回给前端
        return new Result(e.getCode(),null,e.getMessage());
    }
}

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

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

相关文章

CSRF与SSRF比较

CSRF与SSRF比较 参考&#xff1a;简述CSRF、SSRF的区别 CSRF CSRF&#xff0c;全名 Cross-site requestforgery&#xff0c;也就是 跨站请求伪造。XSS是跨站脚本攻击。与XSS比较&#xff0c;XSS攻击是跨站脚本攻击&#xff0c;CSRF是跨站请求伪造&#xff0c;也就是说CSRF攻…

【Redis】入门篇之相关概念与Redis的安装

目录 一、关系型数据库与非关系型数据库 1、非关系数据库的种类 2、关系型数据库与非关系型数据库的区别 二、认识Redis 1、概念 2、特点 1.键值型 2.单线程 3.低延迟、速度快 4.支持数据持久化 5.支持主从集群、分片集群 6.支持多语言客户端 三、Redis的安装 1、…

IO-IO基础

简介 IO流&#xff0c;以计算机内存为主体&#xff0c;从内存到网络/磁盘等其他地方叫输出流(内存往外出)&#xff1b;网络/磁盘等其他地方写到内存叫输入流&#xff08;往内存输入&#xff09;。 Java中的IO流 4个抽象基类 InputStream/Reader(读到内存里) 所有的输入流的基…

环境变量详解

目录 环境变量是什么&#xff1f; 常见环境变量 查看环境变量 指令查看 代码查看 系统调用查看 本地变量 环境变量全局性 环境变量是什么&#xff1f; 我们要执行一个我们所写的c/c程序时&#xff0c;需要./可执行文件&#xff0c;告诉操作系统你在哪里&#xff0c…

PC Cleaner Pro(电脑清理工具)图文安装教程

OneSafe PC Cleaner 会查找并删除垃圾文件和快捷方式&#xff0c;这些文件和快捷方式会随着时间的推移在您的 PC 上堆积&#xff0c;从而占用您的硬盘空间。该软件会搜索并删除已卸载程序留下的无效快捷方式和文件。OneSafe PC Cleaner 还会识别并删除注册表中不必要的条目。 W…

YOLOv8详解代码实战,附有效果图

YOLOv8架构 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本&#xff0c;目前支持图像分类、物体检测和实例分割任务&#xff0c;鉴于Yolov5的良好表现&#xff0c;Yolov8在还没有开源时就收到了用户的广泛关注。yolov8的整体架构如下&…

vue3计算属性与监视及watchEffect函数

computed计算属性 首先看一下页面的结构 在v3中可以用v2的方式来写计算属性&#xff0c;但是不建议这么写 而想要在v3中使用计算属性&#xff0c;需要先引入它 它不想之前在v2中的函数了&#xff0c;而是要写在computed()里面 当然这个计算属性是简写&#xff08;没有考虑计算…

Python opencv 先腐蚀后膨胀 消除图像噪声

cv2.getStructuringElement()介绍 在进行图像形态学操作时&#xff0c;首先需要构造一个特定的核&#xff0c;该核可以自定义生成&#xff0c;也可以通过cv2.getStructuringElement()函数构造。 cv2.getStructuringElement(shape, ksize)参数&#xff1a; shape ---- 代表形状…

常见在线AI绘画平台

系列文章目录 Midjourney AI绘画工具使用保姆级教程 本地部署Stable Diffusion教程&#xff0c;亲测可以安装成功 Stable Diffusion界面参数及模型使用 文章目录系列文章目录前言一、Midjourney二、DreamStudio三、Lexica四、STOCKIMG.AI五、Dream by WOMBO六、PicSo七、百…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析

查看原文>>>ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析 目录 专题一、空间数据获取与制图 专题二、ArcGIS专题地图制作 专题三、空间数据采集与处理 专题四、遥感数据处理与应用 专题五、DEM数据…

macOS Big Sur 11.7.6 (20G1231) Boot ISO 原版可引导镜像

本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 2023 年 4 月 10 日&#xff08;北京…

压力测试工具JMeter的下载安装与基础使用(一)

JMeter的下载安装与基础使用1.环境准备2.下载与配置2.1下载并解压2.2 配置系统变量 JMETER_HOME2.3配置系统变量 CLASSPATH3.测试JMeter是否配置成功4. 语言修永久修改为中文&#xff08;可选&#xff09;1.环境准备 JMeter是用java开发的&#xff0c;示例Apache JMeter5.5版本…

css动画及背景设置

css属性 clip-path 属性使用裁剪方式创建元素的可显示区域。区域内的部分显示&#xff0c;区域外的隐藏。可以指定一些特定形状。 可以创建多边形内容显示区域polygon clip-path: polygon(0 0, 100% 0, 100% 75vh 0 100%); 顺序 1初始x y 为0 0 1向2位置 x轴移动100% y移…

SpringBoot集成elasticsearch使用(增删改查)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 SpringBoot集成elasticsearch使用&#xff08;增删改查&#xff09;一、es是什么&#xff1f;二、使用步骤1.搭配环境springboot集成es1、新建springboot项目&#xff0c;引入…

19_I.MX6ULL_SPI实验

目录 SPI简介 I.MX6U ECSPI简介 相关寄存器 ICM-20608简介 实验源码 SPI简介 同I2C一样,SPI是很常用的通信接口,也可以通过SPI来连接众多的传感器。相比I2C接口, SPI接口的通信速度很快, I2C最多400KHz,但是SPI可以到达几十MHz。I.MX6U也有4个SPI接口,可以通过这4个SPI接…

电感为什么会有饱和电流

电感有一个重要的参数那就是饱和电流&#xff0c;饱和电流的定义是当电感感值下降30%时流过电感的电流。 那么电感为什么会有饱和电流呢&#xff1f; 这个是电感磁芯的磁化曲线&#xff0c;横坐标是磁场强度H&#xff0c;纵坐标是磁感应强度B 在磁场强度较小的时候&#xff0c;…

大数据需要学哪些内容

大数据技术是当今互联网时代的热点之一&#xff0c;目前已经成为了各行各业中的最佳选择。随着物联网、人工智能、云计算等技术的发展&#xff0c;数据的规模不断增大&#xff0c;数据分析、数据挖掘、人工智能等应用也随之蓬勃发展&#xff0c;对大数据开发的需求越来越多。因…

智能网卡-提升网络性能的新选择

一、智能网口介绍 智能网卡&#xff08;Smart NIC&#xff09;是一种专用于网络数据处理的高性能网卡&#xff0c;采用了定制芯片、高速网络接口和强大的软件支持&#xff0c;可以为数据中心和企业网络提供更快、更安全、更可靠的网络连接和数据传输服务。 智能网卡的出现受到…

教你使用Apache搭建Http

Apache2默认采用的是80端口号&#xff0c;因此直接通过公网ip或域名就能访问。现实中&#xff0c;很多服务器本身就部署了许多其它服务&#xff0c;80端口号往往被占用&#xff0c;因此就需要将Apache2改成其它访问端口。 修改端口&#xff0c;首先需要修改/etc/apache2/ports…

数组排序详解

数组排序详解1、排序算法小结2、排序算法原理及实现2.1 归并排序2.2 快速排序2.3 冒泡排序2.4 插入排序2.5 选择排序2.6 希尔排序&#xff1a;1、排序算法小结 排序算法可以分为两大类&#xff1a; &#xff08;1&#xff09;非线性时间排序算法&#xff1a;通过比较来决定元素…