Java实现全局异常统一处理

news2024/9/23 15:32:04

Java实现全局异常统一处理

  • 【一】介绍
  • 【二】为什么要使用全局异常处理
  • 【三】案例实现
    • 【1】GlobalException
    • 【2】GlobalExceptionHandler
    • 【3】使用

【一】介绍

全局异常处理器是一种在应用程序中几种处理异常的机制,它允许在应用程序的任何地方抛出异常时,通过集中的异常处理器进行捕获、记录和处理,而不是在每个可能跑出异常的地方都进行单独处理。

在Java应用中,特别是在使用Spring框架的项目中,全局异常处理器通常通过实现HandlerExceptionResolver 接口、使用 @ControllerAdvice 注解或实现 ErrorController 接口来实现。

【二】为什么要使用全局异常处理

如果我们不统一的处理异常,经常会在controller层有大量的异常处理的代码, 比如:

@Slf4j
@Api(value = "User Interfaces", tags = "User Interfaces")
@RestController
@RequestMapping("/user")
public class UserController {

    /**
     * http://localhost:8080/user/add .
     *
     * @param userParam user param
     * @return user
     */
    @ApiOperation("Add User")
    @ApiImplicitParam(name = "userParam", type = "body", dataTypeClass = UserParam.class, required = true)
    @PostMapping("add")
    public ResponseEntity<String> add(@Valid @RequestBody UserParam userParam) {
        // 每个接口充斥着大量的异常处理
        try {
            // do something
        } catch(Exception e) {
            return ResponseEntity.fail("error");
        }
        return ResponseEntity.ok("success");
    }
}

【三】案例实现

首先在项目下创建一个exception的包,用来存放全局异常处理器
在这里插入图片描述

【1】GlobalException

package org.xmxframework.common.exception;

public class GlobalException extends RuntimeException {
    private static final long serialVersionUID = -2429459012219984965L;

    public GlobalException(String message) {
        super(message);
    }

    public GlobalException(String message, Throwable cause) {
        super(message, cause);
    }
}

【2】GlobalExceptionHandler

其中如果发生异常,直接可以返回配置的自定义通用响应对象

@RestControllerAdvice
@ResponseBody
public class GlobalExceptionHandler{
    public final Logger logger = LoggerFactory.getLogger(this.getClass());

    public GlobalExceptionHandler() {
    }

    public void doSomething(Exception e, HttpServletRequest request) {
    }

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler({HttpMessageNotReadableException.class})
    public ResponseResult handleHttpMessageNotReadableException(Exception e, HttpServletRequest request) {
        this.doSomething(e, request);
        this.logger.warn("400-参数解析失败,{},{}", e.getMessage(), request.getServletPath());
        return ResponseResult.fail("参数解析失败");
    }

    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    @ExceptionHandler({HttpRequestMethodNotSupportedException.class})
    public ResponseResult handleHttpRequestMethodNotSupportedException(Exception e, HttpServletRequest request) {
        this.doSomething(e, request);
        this.logger.warn("405-不支持当前请求方法,{},{}", e.getMessage(), request.getServletPath());
        return ResponseResult.fail("不支持当前请求方法");
    }

    @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
    @ExceptionHandler({HttpMediaTypeNotSupportedException.class})
    public ResponseResult handleHttpMediaTypeNotSupportedException(Exception e, HttpServletRequest request) {
        this.doSomething(e, request);
        this.logger.warn("415-不支持当前媒体类型,{},{}", e.getMessage(), request.getServletPath());
        return ResponseResult.fail("不支持当前媒体类型");
    }

    @ExceptionHandler({Exception.class})
    public ResponseResult handleException(Exception e, HttpServletRequest request, HttpServletResponse response) {
        this.doSomething(e, request);
        if (e instanceof XmxException) {
            if (e.getCause() == null) {
                this.logger.warn("业务提示,{},{}", e.getMessage(), request.getServletPath());
                response.setStatus(200);
            } else {
                this.logger.error("业务异常," + request.getServletPath(), e);
                response.setStatus(500);
            }

            return ResponseResult.fail(e.getMessage());
        } else {
            this.logger.error("系统异常," + request.getServletPath(), e);
            response.setStatus(500);
            return ResponseResult.fail("系统异常");
        }
    }
}

【3】使用

这样就可以根据参数或者其他业务逻辑来统一的返回异常,使代码更加健壮,好维护,而且看着也整洁,而且不需要进行大量的异常处理

@Slf4j
@Api(value = "User Interfaces", tags = "User Interfaces")
@RestController
@RequestMapping("/user")
public class UserController {

    /**
     * http://localhost:8080/user/add .
     *
     * @param userParam user param
     * @return user
     */
    @ApiOperation("Add User")
    @ApiImplicitParam(name = "userParam", type = "body", dataTypeClass = UserParam.class, required = true)
    @PostMapping("add")
    public ResponseEntity<UserParam> add(@Valid @RequestBody UserParam userParam) {
			   //异常处理
			   if(){
			       return new GlobalException("缺少业务参数")
			   }else(){
			       return new GlobalException("xxxxxxx")
			   }
	       return ResponseEntity.ok(userParam);
    }
}


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

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

相关文章

2024年6月scratch图形化编程等级考试一级真题

202406 scratch编程等级考试一级真题 选择题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1、音乐Video Game1的时长将近8秒&#xff0c;点击一次角色&#xff0c;下列哪个程序不能完整地播放音乐两次 A、 B、 C、 D、 答案&#xff1a;D 考点分…

CasaOS系统小主机Docker部署memos结合内网穿透打造私有云笔记

文章目录 前言1. 使用Docker部署memos2. 注册账号与简单操作演示3. 安装cpolar内网穿透4. 创建公网地址5. 创建固定公网地址 前言 本文主要介绍如何在CasaOS轻NAS系统设备中使用Docker本地部署开源云笔记服务memos&#xff0c;并结合cpolar内网穿透工具配置公网地址&#xff0…

STL-queue容器适配器

目录 一、queue 1.1 使用 1.2 模拟实现 二、priority_queue 2.1 使用 2.2 仿函数 2.2.1 概念 2.2.2 使用 2.3 模拟实现 一、queue 1.1 使用 具体解释详见官方文档&#xff1a;queue - C Reference (cplusplus.com) queue就是数据结构中的队列&#xff1a;数据结构之…

体系结构论文导读(三十四):Design of Reliable DNN Accelerator with Un-reliable ReRAM

文章核心 这篇文章主要讨论了一种在不可靠的ReRAM&#xff08;阻变存储器&#xff09;设备上设计可靠的深度神经网络&#xff08;DNN&#xff09;加速器的方法。文章提出了两种关键技术来解决ReRAM固有的不可靠性问题&#xff1a;动态定点&#xff08;DFP&#xff09;数据表示…

日撸Java三百行(day14:栈)

目录 一、栈的基本知识 1.栈的概念 2.栈的功能 3.栈的实现 二、栈的代码实现 1.栈的基本属性与方法 2.栈的遍历 3.入栈实现 4.出栈实现 5.数据测试 6.完整的程序代码 总结 一、栈的基本知识 1.栈的概念 根据百度百科&#xff0c;我们知道“栈”是存储货物或供旅客…

小怡分享之Java图书管理系统

前言&#xff1a; &#x1f308;✨前面小怡给大家分享了抽象类和接口&#xff0c;今天小怡给大家分享用Java实现图书管理系统。 1.功能 不同的用户看到的菜单是不一样的&#xff0c;我们分为两个用户身份&#xff0c;管理员和普通用户。 2.知识点 数据类型、变量、数组、方法…

跳妹儿学编程之ScratchJr(12):综合篇-五只小猴子床上跳

博主资深软件架构师&#xff0c;拥有13年大型软件与互联网系统开发、设计和架构经验&#xff0c;曾就职于华为&#xff0c;现任职于国内知名互联网公司。平时在家教咱家“跳妹儿”编程&#xff0c;并将心得和过程记录下来。希望可以帮助更多对编程感兴趣的家庭。 引言 在前面的…

略读ArrayList源码

ArrayList是Java集合框架中的一部分&#xff0c;底层是通过数组实现的&#xff0c;可以动态增长和缩减。 一、首先看成员变量 序列化ID定义。在Java中&#xff0c;如果一个类实现了Serializable接口&#xff0c;那么它的serialVersionUID就非常重要了。serialVersionUID用于确…

Cesium初探-CallbackProperty

在Cesium中&#xff0c;CallbackProperty 是一种非常有用的特性&#xff0c;可以用来动态更新实体的属性&#xff0c;如位置、方向、高度等。CallbackProperty 允许你在指定的时间点计算属性值&#xff0c;这样就可以实时地改变实体的状态而不需要频繁地重新设置整个属性。 下…

PCIe学习笔记(16)

层次结构&#xff08;Hierarchy&#xff09;ID Message &#xff08;PCIe I/O 互连的树形拓扑结构称为 PCIe 的 Hierarchy&#xff0c;或称层级、层次&#xff08;不是事务层、数据链路层的“层”&#xff09;。层次区域是指与 RC 某一 RP 相关联的所有设备和链路组成的线路结…

【Linux课程学习】:对于权限的理解(粘滞位)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 这篇文章主要理解权限的概念&#xff0c;以及如何更改…

CSS:图片间空白间距问题的解决方案

一、问题描述 今天有小伙伴遇到多张图片排版显示时中间存在空白间隙&#xff0c;问如何处理&#xff1a; <div> <img width"100%" src"https:/xxx.png" id"1747098" style"max-width:100%;"><img width"100%&qu…

学习进行到了第十七天(2024.8.5)

1.Mybatis的定义 数据持久化是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中数据模型的统称。例如&#xff0c;文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。MyBatis 支持定制化 SQL、存储过程以及高级映射&#xff0c;可以…

【leetcode详解】另一棵树的子树 (C++递归:思路精析 过程反思)

思路详解&#xff1a; 总体框架&#xff1a; 对root树进行先序遍历&#xff0c;如果当前结点&#xff08;记为cur&#xff09;的值和subRoot的根节点值相等时&#xff0c;就开始判断 以cur为根节点的树 和 子树 是否结构一样? 如何判断两棵树是否结构完全相同&#xff1f; …

Docker Remote API未授权访问漏洞

9.Docker Remote API未授权访问漏洞 步骤一:使用以下Fofa语句对Docker产品进行搜索. port"2375" 步骤二:直接使用浏览器访问以下路径 /version#查看版本信息 /info#查看容器信息 漏洞修复 1.端口访问控制 对2375端口做网络访问控制&#xff0c;如设置iptables…

人工智能时代程序员生存法则

随着AIGC&#xff08;如chatgpt、midjourney、claude等&#xff09;大语言模型接二连三的涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作&#xff0c;也有人认为AI是提高效率的得力助手。面对这一趋势,…

什么是亚马逊测评?亚马逊测评的技术要求有哪些?

今天将深入探讨亚马逊测评&#xff0c;这一备受关注的轻资产创业项目&#xff0c;吸引了众多创业者的目光。为了帮助大家更好地理解亚马逊测评&#xff0c;将回答一些常见问题&#xff0c;并分享相关知识。 什么是亚马逊测评&#xff1f; 亚马逊测评是为亚马逊商家提供的一项…

2011-2023各省数字普惠金融指数数据(覆盖广度、使用深度和数字化程度)

2011-2023各省数字普惠金融指数数据 1、时间&#xff1a;2011-2023年 2、指标&#xff1a;数字金融普惠指数、数字金融覆盖广度指数、数字金融使用深度指数、普惠金融数字化程度指数、数字金融使用深度指数下属的支付、保险、货币基金、信用服务、投资、信贷等分类指数 3、范…

【MATLAB源码-第242期】基于matlab的OFDM+QPSK系统莱斯信道Ricain信道估计仿真采用LS方法,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;正交频分复用&#xff09;是一种广泛应用于现代通信系统的多载波传输技术&#xff0c;其主要优点包括高频谱效率、抗多径衰落和抵抗频率选择性衰落。OFDM系统通过将高速数据流分割成多个低速数据流&#xff…

javascript:检测图片的宽高

1 方案描述 JavaScript提供了非常方便的FileReader和Image对象&#xff0c;可以帮助我们轻松实现这个功能。具体步骤如下&#xff1a; 获取文件输入框&#xff1a;首先&#xff0c;我们需要获取到用户选择的文件。读取文件内容&#xff1a;然后&#xff0c;通过FileReader对象…