Springboot全局异常和自定义异常

news2024/10/6 8:40:33

目录

依赖

一、全局异常处理 

1、系统异常

 2、业务异常

(1)、接口配置

(2)、服务配置

二、自定义异常 

依赖

        <!-- validator,用于接口参数校验 -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>

一、全局异常处理 

1、系统异常

在common目录中新建一个BaseException.class,用于接受全局的异常,一定要附上@RestControllerAdvice,才能被识别。

/**
 * 全局异常处理器
 */
@RestControllerAdvice
public class BaseException {

}

对于参数格式有问题、代码运行错误等不可控因素的系统报错,默认的效果是这样:

而以下是系统异常的封装处理,返回我们规范的报错信息,

@ExceptionHandler是针对不同的报错类

@RequestLogAnnotation是我的aop日志处理,用于保存mysql

/**
 * 全局异常处理器
 */
@RestControllerAdvice
public class BaseException {

    /**
     * 系统异常
     * @param e 异常信息
     * @return Result
     */
    @ExceptionHandler(value = {Exception.class})
    @RequestLogAnnotation
    @ResponseBody
    public Result exceptionHandler(Exception e){

        return Result.error(500,"系统异常错误,请联系系统管理员处理!");
    }
}

他的结果就是这样的:

 2、业务异常

(1)、接口配置

我这里以post接口@RequestBody为例,接口如下,给dto对象前加上@Validated,

     /**
         * 登录
         * @param dto 暂存输入参数dto对象
         * @return
         */
        @RequestLogAnnotation(value = "用户登录")
        @PostMapping("/login")
        public Result login(@RequestBody @Validated LoginDto dto) {

                        // 进行对比
                        Login res = loginService.userLogin(dto);

                        // 判断结果是否返回该账号信息
                        if (res != null) {   
                                return Result.success(200, "登录成功", data);
                        } else {
                                return Result.error(501, "登陆失败");
                        }
        }

 然后,在实体类中给对应参数,加上@NotNull,其中的【(message = "用户账号不能为空")】这一段是在参数未空时报错返回的信息,用于返回给前端,但需要后台处理。

/**
 * 接受登录请求的参数
 */
@Data
public class LoginDto {

    @NotNull(message = "用户账号不能为空")
    private String id;

    @NotNull(message = "用户密码不能为空")
    private String password;
}
(2)、服务配置

最后在前面的全局异常类中添加如下代码:

/**
     * 请求参数缺失异常处理
     * @param ex
     * @return
     */
    @ExceptionHandler(value = {MethodArgumentNotValidException.class})
    @ResponseStatus(HttpStatus.OK)
    @RequestLogAnnotation
    @ResponseBody
    public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        Result result = new Result();
        BindingResult bindingResult = ex.getBindingResult();
        StringBuilder sb = new StringBuilder("校验失败:");
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            sb.append(fieldError.getDefaultMessage()).append(", ");
        }
        String msg = sb.toString();
        result.setCode(500);
        result.setMsg(msg);
        return result;
    }

这时候请求里因为参数缺失,就会通过这个方法报错:

二、自定义异常 

 新建一个自定义异常类ServiceException.class,继承RuntimeException,如下(这里为了简化,只留一个getter方法和1个构造函数):

public class ServiceException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public ServiceException (Integer code, String msg) {
        super(msg);
        this.code = code;
    }
}

然后在全局异常类中添加如下代码(和系统异常基本一致,只需要更换@ExceptionHandler中的对应类即可):

    /**
     * 如果抛出的的是ServiceException,则调用该方法
     * @param e 服务异常
     * @return Result
     */
    @ExceptionHandler(ServiceException.class)
    @RequestLogAnnotation
    @ResponseBody
    public Result serviceExceptionHandle(ServiceException e){

        return Result.success(e.getCode(), e.getMessage());
    }

这时候就可以在接口中使用try和catch方法进行判断异常使用了,如下:

         // sql执行判断
        try{
            res = getOne(queryWrapper);
        } catch (Exception e) {    
            throw new ServiceException(500, e);
        }

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

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

相关文章

淘宝京东拼多多品牌价格监控API接口

淘宝、京东、拼多多品牌价格监控API接口需要从官方平台获取&#xff0c;以下是具体步骤&#xff1a; 登录京东、天猫、淘宝、拼多多、苏宁、国美、唯品会等电商平台&#xff0c;注册并获取开发者账号和API接口权限。通过开发者账号和API接口权限&#xff0c;访问京东、天猫、淘…

linux中单节点安装greenplum数据库

目录 一、安装包准备 二、关闭防火墙 三、安装greenplum依赖包 四、添加配置 五、新建greenplum用户 六、安装greenplum安装包 七、设置环境变量 八、权限互通 九、修改数据库配置文件 十、初始化数据库 十一、配置远程连接文件 十二、说明 一、安装包准备 下载准备…

Windows网络管理及诊断命令整理

目录 traceroute&#xff1a; ping&#xff1a; pathping: netstat: ipconfig&#xff1a; nslookup&#xff1a; route&#xff1a; ARP: FTP: netsh&#xff1a; nbtstat&#xff1a; sniffer(嗅探器)&#xff1a; winipcfg&#xff1a; traceroute&#xff1a; …

【无公网IP内网穿透】基于NATAPP搭建Web站点

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《.内网穿透》。&#x1f3af;&#x1f3af; &#…

读书笔记:多Transformer的双向编码器表示法(Bert)-4

多Transformer的双向编码器表示法 Bidirectional Encoder Representations from Transformers&#xff0c;即Bert&#xff1b; 第二部分 探索BERT变体 从本章开始的诸多内容&#xff0c;以理解为目标&#xff0c;着重关注对音频相关的支持&#xff08;如果有的话&#xff09;…

Nginx、Git、Gitee的介绍及使用

目录 1、项目启动思路 2、Nginx 一、下载Nginx 1、下载地址 2、选择下载稳定版本 3、解压安装包 二、Nginx的原理 1、原理图 2、流程分析 三、配置Nginx 1、第一步&#xff1a;解决各种js报错 2、第二步&#xff1a;配置Nginx 3、启动/停止/重启Nginx 4、访问网址 …

企业信息查询:洞悉市场,抢占先机

随着互联网的普及和信息技术的不断发展&#xff0c;我们对于企业工商信息的需求逐渐增加&#xff0c;市面上也出现了很多查询企业信息的产品。作为一家专业的企业数据提供商&#xff0c;经过精心地研发&#xff0c;我们打造了一款“公抓抓”&#xff0c;该平台可以批量爬取国家…

计网 静态库和动态库

计网 静态库和动态库 一.我们先来了解一下一个程序编译成可执行文件的四个过程 1.预处理期&#xff08;预编译&#xff09; 在预处理期会进行替换&#xff0c;将头文件和宏定义进行替换 2.编译期 编译期会将源代码变为汇编语言 3.汇编期 汇编期是把汇编语言变为机器语言…

STM32F103标准库硬件IIC+DMA连续数据发送、接收

目录 前言1、AHT20模块的简单了解&#xff08;为了更好的理解程序语句&#xff09;2、了解DMA相关中断标志位以及I2C相对应的DMA通道3、本篇文章提及程序中相关的变量定义提前了解4、DMAIIC数据发送、接收流程及本文所用程序中相关的函数作用提前了解4.1 DMAIIC数据发送、接收流…

qt判断当前日期是不是当月的最后一天

思路就是&#xff1a;将当前日期1&#xff0c;如果月份发生变化&#xff0c;则证明是最后一天 找一个dateTimeEdit&#xff0c;然后选择个日期&#xff0c;如下&#xff1a; 加入测试代码&#xff1a; QDateTime time ui->dateTimeEdit->dateTime();QDateTime nextWeek…

Debezium日常分享系列之:Debezium 2.3.0.Final发布

Debezium日常分享系列之&#xff1a;Debezium 2.3.0.Final发布 一、重大改变二、PostgreSQL / MySQL 安全连接更改三、JDBC 存储编码更改四、新功能和改进五、Kubernetes 的 Debezium Server Operator六、新的通知子系统七、新的可扩展信号子系统八、JMX 信号和通知集成九、新的…

如何查看dll文件内导出函数名称

一 使用VS自带工具 进入VS开发环境&#xff0c;然后Tools -> Visual studio 2017 Command Prompt&#xff0c;打开兼容工具命令提示符&#xff0c; 如果工具 目录下没有命令行提示&#xff0c;可以从开始菜单找到VS的命令行提示符。 cd到dll所在目录&#xff0c;输入命令…

联邦学习综述

《Advances and Open Problems in Federated Learning》 选题&#xff1a;Published 10 December 2019-Computer Science-Found. Trends Mach. Learn. 联邦学习定义 联邦学习是一种机器学习设置&#xff0c;其中多个客户端在中央服务器或服务提供商的协调下协作解决机器学习…

VR会议:远程带看功能,专为沉浸式云洽谈而生

随着科技的不断发展&#xff0c;VR技术已经成为当今市场上较为热门的新型技术之一了&#xff0c;而VR会议远程带看功能&#xff0c;更是为用户提供更加真实、自然的沉浸式体验。 随着5G技术的发展&#xff0c;传统的图文、视频这种展示形式已经无法满足消费者对信息真实性的需求…

存档&改造【04】二维码操作入口设置细节自动刷新设置后的交互式网格内容的隐藏

因为数据库中没有数据无法查看设置效果&#xff0c;于是自己创建了个测试数据表&#xff0c;用来给demo测试 -- 二维码操作入口设置 create table JM_QR_CODE(QR_CODE_ID NUMBER generated as identity primary key,SYSTEM_ID NUMBER(20) not null,IS_ENAB…

中国数字化转型浪潮下,移动钱包成为全球App标配

中国&#xff0c;一个数字化转型极为快速的国家&#xff0c;在电子钱包和移动支付方面处于世界领先地位。 在中国&#xff0c;几乎一半的店内购物都是通过手机进行的&#xff0c;这远高于其他发达市场的水平&#xff08;德国25%&#xff0c;美国24%&#xff09;。移动支付&…

AI情感陪伴 | 数字伙伴为你而在,解锁情感健康的新时代

当我们审视当今社会的变革和进步时&#xff0c;不难发现新一代年轻人正面临着前所未有的多重挑战。其中就涵盖了社交关系的复杂性、学业上的巨大压力、激烈的就业竞争&#xff0c;以及紧迫的环境问题等等。这些挑战不仅深刻地影响着他们的生活品质&#xff0c;还可能引发严重的…

AUTOSAR CAN通信全过程

1、CAN通信概略图和基本概念介绍 应用层APPL、RTE&#xff08;实时运行环境 Runtime Environment&#xff09; 交互层&#xff1a; IPDU multiplexer&#xff1a;协议数据单元复用模块 COM&#xff1a;COMMUNICATION 通信模块 DCM: 诊断通信管理模块&#xff08;Diagnostic C…

多项目并行管理:优化协调策略提高效率

多项目同时进行已然是大部分项目管理者面临的现状了。相比于单项目管理&#xff0c;多项目管理可能会出现项目资源分配不均&#xff0c;项目进度监控难以及沟通协作复杂等问题。 可以通过一款灵活高效得项目管理工具&#xff0c;来帮助您进行多项目管理&#xff0c;比如 Zoho …

SSL证书如何提升网站的安全性和信任度

在今天的数字时代&#xff0c;随着网络攻击的日益增多&#xff0c;确保网站和用户数据的安全变得至关重要。SSL&#xff08;Secure Sockets Layer&#xff09;证书是一个有效的安全解决方案&#xff0c;可以为您的网站提供加密通信通道&#xff0c;并提升其安全性和信任度。下面…