JAVA 中异常处理的最佳实践

bartender 10.1破解版|bartender条码打印10.1 点击下载出处:BarTender10.1破解版 bartender10.1破解版是一款专业的条码打印软件,在行业内广受好评,通过使用bartender我们可以将标签设计这个复杂的过程变得更简便,在设计中快速调整,即刻打印,非常迅速,BarTender10.1破解版不仅支持的标签类型包括EPC Class 1 、Gen2 、ISO 18000-6b 、ISO 15693 、Tag-It 、I-CO... 阅读详情

前言

异常处理的问题之一是知道何时以及如何去使用它。我会讨论一些异常处理的最佳实践,也会总结最近在异常处理上的一些争论。

作为程序员,我们想要写高质量的能够解决问题的代码。但是,异常经常是伴随着代码产生的副作用。没有人喜欢副作用,因此我们会试图用自己的方式来解决这个问题。我看过不少的程序用下面的方法应对异常:

上面这段代码的问题在哪里?

一旦一个异常被抛出之后,正常的执行流程会停止并且将控制交给捕捉块。捕捉块捕获异常,然后只是把它的信息打印了一下。之后程序正常运行,就像没有任何事情发生一样。

那下面的这种方法呢?

这是一个空方法,里面没有任何的代码。为什么一个空方法能够抛出异常?JAVA并不阻止你这么做。最近,我遇到了一些和这个很相似的代码,明明代码块中没有抛出异常的语句,却在方法声明中抛出异常。当我问开发人员为什么这么做,他会回答“我知道这样会影响API,但是我之前就这么做的而且效果还不错”。

C 社区花了好久才决定如何使用异常。这场争论也在JAVA社区产生了。我看到不少JAVA开发人员艰难的使用异常。如果不能够正确使用的话,异常会影响程序的性能,因为它需要使用内存和CPU来创建,抛出以及捕获。如果过度使用的话,会使得代码难以阅读,并且影响API的使用人员。我们都知道这将会带来代码漏洞以及坏味道。客户端代码常会通过忽略这个异常或是直接将其抛出来避开这个问题,就像之前的两个例子那样。

小编是一个有着5年工作经验的java程序员,对于java,自己有做资料的整合,一个完整学习java的路线,学习资料和工具,相信这里有很多学习java的小伙伴,我创立了一个2000人学习扣群,479121291。每晚都有java的直播课程。无论是初级还是进阶的小伙伴小编我都欢迎!

异常的本质

从广义的角度来说,一共有三种不同的场景会导致异常的产生:

编程错误导致的异常:这一类的异常是因为不恰当的编程带来的(比如 , )。客户端通常无法对这些错误采取任何措施

客户端代码的错误:客户端代码在API允许的范围之外使用API,从而违背了合约。客户端可以通过异常中提供的有用信息,采用一些替代方法。比如,当解析格式不正确的XML文件时,会抛出异常。这个异常中包含导致该错误发生的XML内容的具体位置。客户端可以通过这些信息采取回复措施。

资源失效导致的异常:比如系统内存不足或是网络连接失败。客户端面对资源失效的回应是要根据上下文来决定的。客户端可以在一段时间之后试着重新连接或是记录资源失效日志然后暂停应用程序。

JAVA异常类型

JAVA定义了两种异常:

需检查的异常:从 类继承的异常都是需检查异常。客户端需要处理API抛出的这一类异常,通过try-catch或是继续抛出。

无需检查的异常: 也是 的子类。但是,继承了 的类受到了特殊的待遇。客户端代码无需专门处理这一类异常。

下图展示了 的继承树:

上图中, 继承自 ,因此它也是一个无需检查的异常。

我看到过大量使用需检查异常只在极少数时候使用无需检查异常的。最近,JAVA社区在需检查异常的真正价值上爆发了热烈的讨论。这场辩论源于JAVA是第一个包含需检查异常的主流OO框架。C 和C#根本没有需检查异常。这些语言中所有的异常都是无需检查的。

从低层抛出的需检查异常强制要求调用方捕获或是抛出该异常。如果客户端不能有效的处理该异常,API和客户端之间的异常协议将会带来极大的负担。客户端的开发人员可能会通过将异常抑制在一个空的捕获块中或是直接抛出它。从而又将这个负担交给了客户端的调用方。

还有人指责需检查异常会破坏封装,看下面这段代码:

方法抛出了两个需检查异常。调用这个方法的客户端必须明确的处理这两种具体的异常,即使它们并不清楚 内究竟是哪个文件访问或是数据库访问失败了,而且它们也没有提供文件系统或是数据库的逻辑。因此,这样的异常处理导致方法和调用者之前出现了不当的强耦合。

设计API的最佳实践

在讨论了这些之后,我们可以来探讨一下如何设计一个正确抛出异常的良好的API。

1.在选择抛出需确定异常或是无需确定异常时,问自己这样的一个问题:客户端代码在遇到异常时会进行怎样的处理?

如果客户端能够采取措施从这个异常中恢复过来,那就选择需确定异常。如果客户端不能采取有效的措施,就选择无需确定异常。有效的措施是指从异常中恢复的措施,而不仅仅是记录错误日志。

除此以外,尽量选择无需确定的异常:它的优点在于不会强迫客户端显式地处理这种异常。它会冒泡到任何你想捕获它的地方。JAVA API提供了许多无需检查的异常如 , 和 。我倾向于使用JAVA提供的标准的异常,尽量不去创建自己的异常。

2.保留封装

永远不要将特定于实现的异常传递到更高层。比如,不要将数据层的 传递出去。业务层不需要了解 。你有两个选择:

将 转换为另一个需检查异常,如果客户代码需要从异常中恢复。

将 转换为无需检查异常,如果客户端代码无法对其进行处理。

大多数时候,客户代码无法解决 。这时候就将其转化为无需检查的异常。

这里的catch块并没有做任何事情。不如通过如下的方式解决它:

这里将 转化为了 。如果 出现了,catch块就会抛出一个运行时异常。当前执行的线程将会停止并报告该异常。但是,该异常并没有影响到我的业务逻辑模块,它无需进行异常处理,更何况它根本无法对 进行任何操作。如果我的catch块需要根异常原因,可以使用 方法。

如果你确信业务层可以采取补救措施,你可以将其转化为一个更有意义的无需检查异常。但是我觉得抛出RuntimeException足以适用大多数的场景。

3.当无法提供更加有用信息时,不要自定义异常

下面这段代码有什么问题?

它没有给客户端代码提供任何有用的信息,除了一个稍微具有含义的命名。不要忘了 类和别的类一样,在里面你可以添加一下方法供客户端调用,获得有用的信息。

新版本的异常提供了两个有用的方法: ,它会返回请求的名字,和 ,它会返回一组相近的可用的用户名。客户端可以使用这些方法来获取有用的信息。但是如果你不准备添加这些额外的信息,那就抛出一个标准的异常即可。

如果你觉得客户端代码在记录日志之外对这个异常不能进行任何操作,那么最好抛出无需检查异常:

除此以外,你还可以提供一个方法来检查用户名是否已经被使用。

4.文档化异常

你可以使用Javadoc的 标记来记录需检查异常和无需检查异常。但是,我倾向于写单元测试来文档化异常。单元测试允许我在使用中查看异常,并且作为一个可以被执行的文档来使用。无论你采用哪种方法,尽量使你的客户端代码了解你的API会抛出的异常。这里提供了 的单元测试。

上面这段代码在调用 应当抛出 。如果没有抛出该异常,则会执行 显式的说明该测试失败了。通过为异常编写测试,你不仅能记录异常如何触发,而且使你的代码在经过这些测试后更加健壮。

使用异常的最佳实践

1.自觉清理资源

如果你在使用如数据库连接或是网络连接之类的资源,要确保你及时的清理这些资源。如果你调用的API仅仅出发了无需检查异常,你仍然需要在使用后主动清理。使用 块。

类关闭 连接。这里的重点在于在 块中关闭连接,无论是否出现了异常。

2.永远不要使用异常来控制流

生成栈追踪的代价很昂贵,它的价值在于debug过程中使用。在一个流程控制中,栈追踪应当被忽视,因为客户端只想知道如何进行。

在下面的代码中, 被用来进行流程控制:

通过无限循环来增加计数,直到抛出异常。这种方式使得代码难以阅读,而且影响代码性能。只在出现异常的场景抛出异常。

3.不要无视或是压制异常

当API的方法会抛出异常的时候,它在提醒你应当采取一些措施。如果需检查异常没有任何意义,那就干脆将其转化为无需检查异常再重新抛出。不要单纯的用catch捕获它然后继续执行,仿佛什么都没有发生一样。

4.不要捕获最高层异常

继承 的异常同样是 的子类。捕获 的同时,也捕获了运行时异常:

5.只记录异常一次

将同一个异常多次记入日志会使得检查追踪栈的开发人员感到困惑,不知道何处是报错的根源。所以只记录一次。

觉得本文对你有帮助?请分享给更多人。

FDTD超表面仿真详细教程,几何相位,共振相位,传播相位 FDTD的超表面主要几何相位型(PB型)和共振型两种类型,其中PB型每个cell中的纳米棒的长宽相同,旋转角度不同,共振型长宽不同,旋转角度相同。本博文中以最常见的长方形纳米棒为例,用FDTD演示两种超表面实现的聚焦透镜的功能,包含详细步骤,其他形状,材料的超表面可自行尝试。 阅读详情

相关推荐

408计算机复试专业课问答汇总

408计算机复试专业课问答汇总

weixin_45930223的博客 3702

异常处理的艺术:Java中的最佳实践

在Java编程中,异常处理是确保程序健壮性和可维护性的关键环节。通过遵循最佳实践,如捕获特定的异常、记录日志、尽早捕获异常、只在必要的地方使用try-catch、能用if-else就别用异常以及不要在finally中处理返回值,我们能够编写出更可靠和可维护的代码。

xycxycooo的博客 1476

微信中调起支付宝支付

微信中调用支付宝支付,首先我们知道微信是不能直接调用支付宝的,所以我们需要使用一个中间页提示用户在浏览器中打开,然后进行网页支付或打开app支付。以下为详细唤起支付宝的步骤、业务代码以及相关页面图。 如有问题欢迎评论留言,看到定回复哦^_^\(^o^)/~ 一、微信中唤起支付宝,有几个步骤: 1、中间页引导用户在浏览器中打开去唤起支付宝。 2、浏览器中打开支付宝或app中打开支付宝。 3...

han_calligrapher的博客 2万+

Java异常处理最佳实践,程序员必会知识

// use the inputStream to read a file} catch (FileNotFoundException e) {log.error(e);} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {log.error(e);}}}}如果你的资源实现了 AutoCloseable 接口,你可以使用这个语法。大多数的 Java 标准资源都继承了这个接口。当你在 try

m0_60635176的博客 1205

智能气象站:ESP32驱动的心知天气数据可视化实践

本文详细介绍了基于ESP32微控制器和心知天气API构建智能气象站的完整实践。通过Arduino开发环境,实现天气数据的获取、JSON解析与OLED屏可视化展示,涵盖硬件连接、API配置、低功耗优化及部署问题排查,为物联网开发者提供实用指南。

jump7的博客 214

用gm/Id方法设计简单折叠式共源共栅放大器

gm/Id

qq_45541367的博客 2万+

Java中的异常处理最佳实践

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!异常处理是Java编程中的核心部分,正确的异常处理不仅能让程序更加健壮,也能提升代码的可维护性和可读性。本篇文章将介绍Java异常处理的最佳实践,包括如何定义自定义异常、捕获和处理异常、以及如何设计优雅的异常处理策略。通过自定义异常、合理的捕获和处理策略、以及记录详细的日志,可以使异常处理更加高效和优雅。定义合理的异常层次结构可以帮助处理异常时做出更精确的响应。有时,Java的标准异常类无法满足需求,这时可以定义自定义异常类。

聚娃科技开发者博客 786

避坑指南:RK3588上编译EtherCAT 1.6时遇到的权限问题和模块安装错误

本文详细解析了在RK3588平台上编译EtherCAT 1.6时常见的权限问题和模块安装错误,提供了两种实战解决方案和嵌入式开发的通用权限管理策略。通过优化内核配置和编译参数,显著提升实时性能,帮助开发者高效完成EtherCAT主站部署。

weixin_33724046的博客 454

Java 异常处理的 9 个最佳实践

在 Java 中,异常处理是个很麻烦的事情。初学者觉得它很难理解,甚至是经验丰富的开发者也要花费很长时间决定异常是要处理掉和抛出。 所以很多开发团队约定一些原则处理异常。如果你是一个团队的新成员,你可能会很惊讶,因为他们约定的规则可能和你以前使用的规则不一样。 不过,有很多最佳实践的规则,被大部分团队接受。这里有 9 大重要的约定,帮助你学习或者改进异常处理。 1、在

开源中国(oschina)的博客 2804

API安全攻防实战:从信息搜集到漏洞利用的完整路径

本文详细解析了API安全攻防实战的全过程,从信息搜集到漏洞利用,涵盖了渗透测试的核心技巧和工具使用。通过真实案例展示如何发现和利用API漏洞,如HTTP方法滥用、内容类型转换攻击等,并提供企业级防御策略和测试心得,帮助安全研究人员提升API安全防护能力。

weixin_30394981的博客 435

量化交易新手入门:从零开始搭建你的第一个Python交易策略(附完整代码)

本文为量化交易新手提供从零开始搭建Python双均线策略的完整指南,涵盖环境配置、数据获取、策略实现及风险管理等关键步骤。通过详细的代码示例和实践建议,帮助读者快速掌握量化交易的核心技术,并避免常见陷阱。文章特别强调Python在量化交易中的技术革新优势,适合希望进入金融科技领域的初学者。

weixin_26905487的博客 445

Java 异常处理的最佳实践

在 Java 开发中,异常处理是一个非常重要的环节。良好的异常处理实践可以提高代码的健壮性、可读性和可维护性。本文将介绍 20 个异常处理的最佳实践,帮助你在实际开发中避免常见的陷阱。

专注Java和MySQL领域知识分享 1281

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java异常处理最佳实践

在 Java 中处理异常并不是一个简单的事情。不仅仅初学者很难理解,即使一些有经验的开发者也需要花费很多时间来思考如何处理异常,包括需要处理哪些异常,怎样处理等等。这也是绝大多数开发团队都会制定一些规则来规范进行异常处理的原因。而团队之间的这些规范往往是截然不同的。 本文给出几个被很多团队使用的异常处理最佳实践。 在 finally 块中清理资源或者使用 try-with-resource 语句...

ThinkWon的博客 8601

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java异常处理的20个最佳实践

title shortTitle category tag description head Java异常处理的20个最佳实践 Java异常处理的20个最佳实践 Java核心 异常处理 Java程序员进阶之路,小白的零基础Java教程,从入门到进阶...

程序员小明1024 660

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java 异常处理最佳实践_Java 异常处理的 20 个最佳实践,你知道几个?

异常处理是 Java 开发中的一个重要部分,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java 提供了几个异常处理特性,以try,catch 和 finally 关键字的形式内建于语言自身之中。Java 编程语言也允许创建新的自定义异常,并通过使用 throw 和 throws关键字抛出它们。在Java编程中,Java 的异常处理不单单是知道语法这么简单,它必须遵循标准的 J...

weixin_42651887的博客 295

Java异常处理的9种最佳实践

异常处理不仅仅是错误处理,更是系统可靠性设计的重要组成部分。好的异常处理能够让系统在面对意外情况时保持稳定,为用户提供更好的体验。

风象南的专栏 1496

java 异常 最佳实践_关于JAVA异常处理的20个最佳实践

在我们深入了解异常处理最佳实践的深层概念之前,让我们从一个最重要的概念开始,那就是理解在JAVA中有三种一般类型的可抛类:检查性异常(checked exceptions)、非检查性异常(unchecked Exceptions) 和错误(errors)。异常类型检查性异常(checked exceptions)是必须在在方法的throws子句中声明的异常。它们扩展了异常,旨在成为一种“在你...

weixin_33419305的博客 353

Java编程中关于异常处理的10个最佳实践

在实践中,异常处理不单单是知道语法这么简单。编写健壮的代码是更像是一门艺术,在本文中,将讨论Java异常处理最佳实践。这些Java最佳实践遵循标准的JDK库,和几个处理错误和异常的开源代码。这还是一个提供给java程序员编写健壮代码的便利手册。Java 编程中异常处理的最佳实践 这里是我收集的10个Java编程中进行异常处理的10最佳实践。在Java编程中对于检查异常有褒有贬,强制处理异

liuyanxue0408的博客 351

关于JAVA异常处理的20个最佳实践

关于JAVA异常处理的20个最佳实践 原文地址 在我们深入了解异常处理最佳实践的深层概念之前,让我们从一个最重要的概念开始,那就是理解在JAVA中有三种一般类型的可抛类: 检查异常(checked exceptions)、未检查异常(unchecked Exceptions) 和 错误(errors)。 异常类型 检查异常(checked exceptions) 是必须在在方法的throw...

天下布武之信长的专栏 3242

【JAVA】异常处理10个最佳实践

异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java提供了几个异常处理特性,以try,catch 和 finally 关键字的形式内建于语言自身之中。Java 编程语言也允许你创建新的异常,并通过使用 throw 和 throws关键字抛出它们。事实上,在Java编程中,Java的异常处理不单单是知道...

187

Java异常处理和最佳实践

自定义检查异常只需要继承 Exception即可,如下代码所示:自定义检查异常的处理方式前面已经介绍,这里不再赘述。自定义非检查异常只需要继承 RuntimeException2、从字节码层面分析异常处理前面已经简单介绍了一下Java 的异常体系,以及如何自定义异常,下面我将从字节码层面分析异常处理机制,通过字节码的分析你将对 try-catch-finally 有更加深入的认识。

qq_38470315的博客 1179
上一篇: 常见的Java基础语法知识都有哪些
下一篇: 深入理解java枚举,让代码更简洁、易懂,提升工作效率!
java03_15
博客等级 码龄9年 263粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值