Java 异常处理下篇:11 个异常处理最佳实践

文章目录

  • 前言
  • 最佳实践
    • 早抛出,晚捕获原则
    • 只捕获实际可处理的异常
    • 不要忽略捕捉的异常
    • 抛出具体的检查性异常
    • 正确包装自定义异常中的异常
    • 记录或抛出异常,但不要同时执行
    • finally 中永远不要抛出异常或返回值
    • 避免使用异常进行流程控制
    • 使用模板方法处理重复的 try-catch
    • 尽量只抛出和方法相关的异常
    • 异常处理后清理资源
  • 总结
  • 个人简介

前言

  • 在前两篇文章中,我们深入研究了 Java 异常处理中的 Throwable 类和异常处理常用关键字以及 finally 使用中的陷阱。在本文中,我们将探讨异常处理的一些最佳实践,这些实践有助于编写更健壮和可维护的程序代码。

最佳实践

早抛出,晚捕获原则

  • 早抛出,晚捕获是异常处理中比较经典的原则,它告诉我们出现异常时应该尽可能早的抛出而不是等异常变得更加复杂后再抛出;而捕获异常时,需要等我们可以处理时再进行捕获,而不是为了捕获而捕获。
public void processInput(String input) {if (input == null) {// 尽可能早的抛出而不是等到异常变得更加复杂后抛出throw new IllegalArgumentException("Input cannot be null");}// 继续处理输入
}

只捕获实际可处理的异常

  • 不要为了捕获异常而捕获,只捕获可以处理的异常来让代码更加健壮,无法处理异常捕获并没有实际意义。
try {// 可能抛出异常的代码
} catch (FileNotFoundException e) {// 处理文件未找到异常
} catch (IOException e) {// 处理其他 IO 异常
}// 没有实际意义的捕获
catch (NoSuchMethodException e) {// 避免这种情况,因为它没有任何帮助throw e; 
}

不要忽略捕捉的异常

  • 避免使用空的 catch 块来忽略异常,这可能导致潜在问题被掩盖,使得调试和维护变得更加困难。
try {// 可能抛出异常的代码
} catch (Exception e) {// 空的 catch 块,可能掩盖潜在问题
}

抛出具体的检查性异常

  • 在方法中抛出具体的受检异常,而不是通用的 Exception,以便提供更明确的异常信息,让调用者更容易处理异常情况。
public void readFile(String filename) throws IOException {// 读取文件的代码
}

正确包装自定义异常中的异常

  • 在自定义异常中包装其他异常时,确保将原始异常作为参数传递给自定义异常的构造函数,以便堆栈跟踪包含所有相关信息,避免信息丢失。
public class CustomException extends RuntimeException {public CustomException(String message, Throwable cause) {super(message, cause);}
}

记录或抛出异常,但不要同时执行

  • 在异常处理中,要么将异常记录下来要么将其抛出,不要两者兼而有之。否则会导致异常被记录多次,对排查问题造成干扰
try {// 可能抛出异常的代码
} catch (Exception e) {// 要么记录处理异常logger.error("An error occurred: {}", e.getMessage(), e);// 要么抛出异常throw new CustomException("An error occurred", e);
}

finally 中永远不要抛出异常或返回值

  • finally 块中进行资源清理时,永远不要抛出异常或返回值,以避免丢失 try-catch 代码块中的异常或者返回值。
try {// 可能抛出异常的代码
} finally {// 不要在 finally 块中抛出异常// 可以记录异常或其他清理操作
}

避免使用异常进行流程控制

  • 异常应该用于处理错误和异常情况,而不应该被用作正常流程控制的手段。使用条件语句或其他逻辑结构来处理正常的程序流程。

使用模板方法处理重复的 try-catch

  • 如果在多个地方有相似的异常处理逻辑,可以考虑将其提取为一个模板方法,以避免重复代码。比如我们经常使用的关闭连接的代码块,可以按照下面的方式实现,而不是在每个需要关闭的地方使用 try-catch:
class DBUtil{public static void closeConnection(Connection conn){try{conn.close();} catch(Exception ex){//Log Exception - Cannot close connection}}
}public void process() {Connection conn = null;try{conn = getConnection();....} finally{DBUtil.closeConnection(conn);}
}

尽量只抛出和方法相关的异常

  • 相关性对于保持代码的可读性非常重要。一个尝试读取文件的方法,如果抛出 NullPointerException,那么它不会给调用者任何相关的信息。相反,如果这种异常被包裹在自定义异常中则会更好。NoSuchFileFoundException 则对该方法的调用者更有用。

异常处理后清理资源

  • 在异常处理中,确保清理已分配的资源,以避免资源泄漏。可以通过在 finally 块中进行清理操作来实现。
InputStream inputStream = null;
try {inputStream = new FileInputStream("example.txt");// 处理输入流
} catch (IOException e) {// 处理异常
} finally {// 关闭输入流,确保资源得到释放if (inputStream != null) {try {inputStream.close();} catch (IOException e) {// 记录关闭异常logger.error("Error closing input stream: {}", e.getMessage(), e);}}
}

总结

  • 通过遵循这些最佳实践,我们可以提高代码的质量、可读性和可维护性,从而确保程序在面对各种情况时能够更加健壮和可靠,以及更好的可维护性。

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

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

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

相关文章

算法训练day24回溯算法理论基础77组合

今日学习链接 https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80 https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html#%E5%89%AA%E6%9E%9D%E4%BC%98%E5%8C%96 回溯算…

sql注入,布尔盲注和时间盲注,无回显

布尔盲注 通过order by分组可以看到,如果正确会i显示you are in,错误则无任何提示,由此可以判断出,目前只显示对错,此外前端不会显示任何数据 也就是说,目前结果只有两种,在这种只有两种变量的…

Uniapp登录页面获取头像、昵称的最新方法的简单使用

前言 写小程序写到登录页面的时候,发现官方文档中原来的wx.getUserInfo和wx.getUserProfile不太能用了,学习了相对比较新的方法,这种方法的文档链接如下: https://developers.weixin.qq.com/miniprogram/dev/framework/open-abil…

交易策略的开发:关于市场到底能不能预测的哲学思考

文章目录 为什么要判断市场能否被预测三个方面来论述这个问题耗散结构理论什么是耗散结构 为什么要判断市场能否被预测 这个问题已经争论几十年了,不仅在股票市场,期货市场,外汇市场, 甚至整个金融市场。至今没有人给出一个科学的论断。 如果…

上位机是什么?与下位机是什么关系

在工业自动化领域中,上位机是一项关键而引人注目的技术。许多人对上位机的概念感到好奇,想要深入了解其在工业智能中的作用。那么,上位机究竟是什么呢? 首先,上位机是一种用于工业控制系统的软件应用,通常…

配置支持 OpenAPI 的 ASP.NET Core 应用

写在前面 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 本文记录如何配置基于Swagger 的 ASP.NET Core 应用程序的 OpenAPI 规范。 需要从NuGet 安装 Swashbuckle.AspNetCore 包 代码实现 var builder WebApplicati…

STM32G4单片机

单片机的基本结构 CPU就是中央处理器,是单片机的内核 时钟电路,时钟源是给整个电路提供时序 其他的外设、中断以及存储器都是通过系统总线与CPU进行连接 RAM相当于电脑的内存条,随机存储器,掉电会丢失 ROM相当于电脑的硬盘&am…

vmstat 监控虚拟内存,进程,CPU

文章目录 1. 命令格式:2. 命令功能:3. 命令参数:4. 使用实例:实例1:显示虚拟内存使用情况实例2:显示活跃和非活跃内存实例3:查看系统已经fork了多少次实例4:查看内存使用的详细信息实…

美籍华裔力学和数学家林家翘

林家翘(1916年7月7日—2013年1月13日),出生于北京,男,原籍福建福州,力学和数学家,美国艺术与科学院院士、美国国家科学院院士、中国科学院外籍院士,麻省理工学院荣誉退休教授 [1]。 …

初始MySQL

一 SQL的基本概述 基本概述 ▶SQL全称: Structured Query Language,是结构化查询语言,用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统SystemR上实现。 ▶美国国家标…

【Linux】Linux基本指令

目录 1.ls指令 2.cd指令 3.touch指令 4.mkdir指令 5.rmdir指令和rm指令 5.1rmdir指令 5.2rm指令 6.man指令 7.cp指令 8.mv指令 9.cat指令 10.more指令 && less指令 10.1more指令 10.2less指令 11.head指令 && tail指令 11.1head指令 11.2tai…

第23课 使用FFmpeg将rtmp流再转推到rtmp服务器

通过上节课的学习,我们已经可以正常播放本地rtmp流及mp4文件,这节课,我们将在上节课的基础上实现一个常用的转推功能:读取rtmp流或mp4文件并转推到rtmp服务器上实现直播转发功能。 一、FFmpeg API 转码推流的一般过程 1.引入ffm…

内存泄漏调试 ---- jemalloc的heap profiling

使用jemalloc时,可以通过profiling机制来发现并定位内存泄漏(memory leak)。本文翻译自原文并增加了一些例子。 1、安装 这里我们编译安装jemalloc.5.10,注意在configure的时候添加了–enable-prof选项,这样才能打开profiling机制。下文中通…

Django的request.session缓存的广发用法

前言: 相信同学们在学习PythonWeb开发的时候和我一样会遇到许多问题,今天我这边举几个例子涉及到session缓存的问题,由于当时并没有接触session缓存的技术内容,所以往往头大,一时间不知带如何解决,老师也会…

2401cmake,学习cmake2

步4:安装与测试 现在开始给项目添加安装规则和支持测试. 安装规则 安装规则非常简单:对MathFunctions,想安装库和头文件,对应用,想安装可执行文件和配置头. 所以在MathFunctions/CMakeLists.txt尾添加: install(TARGETS MathFunctions DESTINATION lib) install(FILES Mat…

服务网格(Service Mesh)流行工具

在这篇博客中,我们将介绍微服务的最佳服务网格工具列表,这些工具提供安全性、金丝雀部署、遥测、负载均衡等。 用于部署和操作微服务的服务网格工具的数量不断增加。在这篇文章中,我们将探讨您应该用来构建自己的服务网格架构的顶级服务网格…

【Eclipse平台】2 Eclipse Workbench工作台介绍

Eclipse Workbench工作台介绍 本文介绍Eclipse工作台Workbench。 当工作台启动时,首先看到的是一个对话框,该对话框允许我们选择工作区的位置。工作区是存储工作的目录。现在,只需单击“确定”即可选择默认位置。 选择工作区位置后&#x…

如何访问 Oracle OKE 集群

OKE是Oracle Cloud提供的托管Kubernetes服务,为用户提供强大而灵活的容器编排平台。在本文中,我们将详细介绍如何有效地与OKE集群进行交互,包括访问集群的不同方式、管理访问权限以及执行常见操作的步骤。 1 安装oci命令 1.1 在Oracle Linux…

【gRPC】protoc文件转py文件

以下基于Win系统下Python的venv虚拟环境演示 《Python3笔记之venv虚拟环境》《Python笔记之pip国内镜像修改方法》 在桌面创建个test目录作为项目目录,初始化venv环境后,安装基础依赖: pip install grpcio grpcio-reflection grpcio-tools p…

证券开户怎么联系专属客户经理?新手必看!

证券开户联系专属客户经理的方式有很多,可以通过手机网上找客户经理,现在这种方式是最多的,比如咱们网站都是各大券商专业的客户经理,在线联系就可以帮您安排。您自己也可以挑选自己觉得好的券商和客户经理,然后再沟通…