java异常处理设计

异常的继承体系

java 中的异常的超类是 java.lang.Throwable(后文省略为 Throwable), 他有俩自类Exception和Error,Error是由jvm管理,我们不需要考虑。
RuntimeException是Exception的子类。

  • 检查异常(Checked Exceptions): 继承自 Exception 但不继承自 RuntimeException 的异常属于受检异常。必须通过 try-catch 块或者在方法签名中使用 throws 关键字来显式处理这些异常,否则编译器会报错。也称为“编译时异常”,编译器在编译期间检查的那些异常。由于编译器“检查”这些异常以确保它们得到处理,因此称为“检查异常”。

  • 非受检异常(Unchecked Exceptions): 继承自 RuntimeException 的异常属于非受检异常。可以捕获处理或者向上传递。
    RuntimeException 是非受检异常的根类,包括诸如 NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException 等运行时错误。通常,这些异常表示编程错误或者其他无法在编译时检测到的问题。
    在这里插入图片描述

什么时候应该抛出异常?

抛出异常的目标是清晰地表达在程序执行期间发生的问题,并提供给上层调用者或者异常处理机制足够的信息以便进行处理或者修复。

  1. 特定的业务逻辑异常。例如,银行应用程序中的 InsufficientFundsException 表示账户余额不足。
  2. 状态机无法转向调用者提供的目标状态。
  3. 非法参数

应该选用哪种异常
通过以上的描述和举例,可以总结出一个结论,**RuntimeException 异常和受检异常之间的区别就是: 是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常 (RuntimeException)。**一般来讲,如果没有特殊的要求,我们建议使用 RuntimeException 异常。

实践

  • 抛出带状态码 RumtimeException 异常
  • 抛出指定类型的 RuntimeException 异常

服务中抛出什么样的异常就自定义一个指定的异常错误,然后在进行抛出异常。

异常设计的准则

  1. 不可以将异常处理作为系统流程的一部分。

  2. 避免过度细分异常,提高重用性。

  3. 避免过度使用 catch(Exception e) 来捕获所有异常。

  4. 不要同时记录和抛出异常,因为异常会打印多次,正确的处理方式要么抛出异常要么记录异常,如果抛出异常,不要原封不动的抛出,可以自定义异常抛出。

  5. 自定义异常不要丢弃原有异常,应该将原始异常传入自定义异常中。
    throw MyException(“my exception”, e);

  6. 自定义异常尽量不要使用检查异常。

  7. 尽可能晚的捕获异常,如非必要,建议所有的异常都不要在下层捕获,而应该由最上层捕获并统一处理这些异常。。

  8. 为了避免重复输出异常日志,建议所有的异常日志都统一交由最上层输出。就算下层捕获到了某个异常,如非特殊情况,也不要将异常信息输出,应该交给最上层统一输出日志。

应用程序中定义的异常应该分为两类:

业务异常:用户能够看懂并且能够处理的异常,比如用户没有登录,提示用户登录即可。
系统异常:用户看不懂需要程序员处理的异常,比如网络连接超时,需要程序员排查相关问题。
在这里插入图片描述

/**
* http 接口异常处理类
*/
@Slf4j
@RestControllerAdvice("org.example.controller")
public class HttpExceptionHandler {/*** 处理业务异常* @param request 请求参数* @param e 异常* @return Result*/@ExceptionHandler(value = BizException.class)public Object bizExceptionHandler(HttpServletRequest request, BizException e) {log.warn("业务异常:" + e.getMessage() , e);return Result.fail(e.getCode(), e.getMessage());}/*** 处理系统异常* @param request 请求参数* @param e 异常* @return Result*/@ExceptionHandler(value = SystemException.class)public Object systemExceptionHandler(HttpServletRequest request, SystemException e) {log.error("系统异常:" + e.getMessage() , e);return Result.fail(e.getCode(), e.getMessage());}/*** 处理未知异常* @param request 请求参数* @param e 异常* @return Result*/@ExceptionHandler(value = Throwable.class)public Object unknownExceptionHandler(HttpServletRequest request, Throwable e) {log.error("未知异常:" + e.getMessage() , e);return Result.fail(e.getMessage());}
}

在 HttpExceptionHandler 类中,@RestControllerAdvice = @ControllerAdvice + @ResponseBody ,如果有其他的异常需要处理,只需要定义@ExceptionHandler注解的方法处理即可。

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

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

相关文章

【kubernetes】认识K8S基础理论

目录 一、k8s是什么? 二、为什么要用k8s? 三、k8s的主要功能 四、k8s的集群架构和组件 4.1k8s的集群架构介绍 4.2k8s的master的核心组件 ①kube-apiserver:作为所有服务请求的统一访问入口 ②kube-controller-manager:控制…

腾讯云域名解析

腾讯云域名解析 1.登录腾讯云控制台,点击“云产品”,选择“云解析”,进入云解析界面;2.在此界面可以选择购买或者添加新的域名,若已经购买了域名,则在域名列表处选择需要解析的域名,点击“解析…

用Python实现学生成绩数据分析

我的代码使用了pygal库来创建一个简单的折线图,并将其保存为SVG格式的文件。下面是对您代码的分析: 学生成绩数据分析表: 分析代码: 导入库:您导入了pygal库,这是一个用于生成可缩放矢量图形(S…

Chrome插件精选 — 颜色拾取

Chrome实现同一功能的插件往往有多款产品,逐一去安装试用耗时又费力,在此为某一类型插件挑选出比较好用的一款或几款,尽量满足界面精致、功能齐全、设置选项丰富的使用要求,便于节省一个个去尝试的时间和精力。 1. ColorZilla 下…

Java 判断字符/字符串相等

通过 判断相等的字符 举例: import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);char ch sc.next().charAt(0);if (ch M)System.out.print("");elseSystem.out.print("不等于…

vue保留用户在列表的操作记录, beforeRouteLeave离开当前组件缓存数据即可

最近遇到一个需求,用户在列表页的查询输入框输入条件后,点击查询,然后此时切换菜单,再回到之前的页面,希望能停留在上一次输入的结果上,如下例子,用户管理页面,输入yangfan这个关键词搜索后,结果如下图: 当我此时点击权限管理后,再点击用户管理切回来,结果依旧如上…

【leetcode题解C++】452.用最少数量的弓箭引爆气球 and 435.无重叠区间

452. 用最少数量的弓箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全…

07.STL单调栈

单调栈的特点&#xff1a; 1.自顶向下一次递增&#xff0c;也就是上小下大的栈 单调栈代码&#xff1a; 算法思想&#xff1a;将不符合单调栈性质的弹出&#xff0c;符合的输入 #include<iostream> #include <stack> #include<queue> using namespace std…

如何修改docker容器的端口映射

要修改 Docker 容器的端口映射&#xff0c;你需要停止并删除现有的容器&#xff0c;然后使用新的端口映射重新运行容器。以下是详细步骤&#xff1a; 停止容器&#xff1a; 使用 docker stop 命令停止正在运行的容器。替换 <container_id> 为你要停止的容器的 ID 或者容器…

什么是智慧公厕?智慧公厕是基于“云大脑”的跨区域公共厕所综合管理系统

在城市快速发展的今天&#xff0c;公共厕所的管理和维护成为了一个重要的问题。传统的公共厕所管理方式往往效率低下、成本较高。然而&#xff0c;随着科技的进步和应用&#xff0c;智慧公厕已经成为了解决这一难题的利器。本文以智慧公厕源头厂家广州中期科技有限公司&#xf…

265.【华为OD机试真题】最长的指定瑕疵度的元音子串(滑动窗口算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-最长的指定瑕疵度的元音子串二.解题思路三.题解…

信息安全工程师 软考回顾(一)

&#x1f433;概述 图源&#xff1a;文心一言 信息安全证书已经考了一年有余&#xff0c;尽管我目前没有从业安全的打算&#xff0c;况且自己的实践能力与从业标准依然有所差距&#xff0c;但其中的内容也值得再温习一遍~&#x1f95d;&#x1f95d; 另外&#xff0c;如果你对…

四、深入学习TensorRT,Developer Guide篇(三)

上一篇文章我们一起看了下TensorRT有哪些特性或者支持哪些功能&#xff0c;这一节我们来详细的从API出发研究一下具体的实现&#xff0c;难度要上升了哦&#xff0c;请系好安全带&#xff0c;准备发车&#xff01; 文章目录 3. The C API3.1 The Build Phase3.1.1 Creating a …

常见消息中间件分享

文章目录 概念核心角色作用&使用场景应用解耦异步通信削峰填谷大数据流处理 使用模型点对点模型发布-订阅模型 常见消息中间件介绍一、kafka二、RabbitMQ三、RocketMQ 比较一、Kafka如何实现高吞吐量二、RocketMQ如何实现事务消息 概念 消息中间件是基于队列与消息传递技术…

C语言----------最后一个单词的大小

1.计算字符串最后一个单词的长度&#xff0c;单词以空格隔开&#xff0c;字符串长度小于5000。&#xff08;注&#xff1a;字符串末尾不以空格为结尾&#xff09; #include <stdio.h> #include<string.h> int main() {char arr[5000];gets(arr);int len strlen(a…

探索NFC技术在游戏玩具娱乐,医疗保健和穿戴设备领域的三大应用

NFC是与众不同的无线技术。这意味着它只能在两个设备相近时起作用。在其他用无线技术随机广播的方式以被接收时&#xff0c;NFC更重要的独特之处于其使用电源的方式。或者&#xff0c;更确切地说&#xff0c;它可以在不供电的环境下进行工作。它是一种非接触式智能卡技术的演进…

python3调用阿里云openapi脚本 - 生产环境

alicloud openapi 调用 - python 场景描述注意事项脚本如下场景描述 在各公司都在降本增效的前提下,可能更多的公司会选择性使用云服务器,这样相比较而言,对后续的服务器维护、产品使用来说,创造出更多便捷的方式,云服务也给我们带来了更多的便捷性,下面是从阿里云上摘抄…

QItemDelegate

一、简介 二、使用 QItemDelegate 的基本步骤 2.1、创建 Item 视图和模型 2.2、创建自定义的委托类 2.3、应用委托类到 Item 视图 三、实例&#xff1a;定制化 Item 视图 一、简介 当我们需要在 Qt 应用程序中自定义 Item 视图的外观和交互行为时&#xff0c;QIt…

spring-security 过滤器

spring-security过滤器 版本信息过滤器配置过滤器配置相关类图过滤器加载过程创建 HttpSecurity Bean 对象创建过滤器 过滤器作用ExceptionTranslationFilter 自定义过滤器 本章介绍 spring-security 过滤器配置类 HttpSecurity&#xff0c;过滤器加载过程&#xff0c;自定义过…

LeetCode23.合并K个升序链表

题目 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 &#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如下&…