java异常处理策略[关闭]

2024-05-17

我正在开发一个应用程序,该应用程序的流程如下 UI--> 后端流程 --> 结果到 UI。

在我的代码中,我使用 try、catch 处理异常。但在代码中,我有很多重复的异常,可能会在不同的类中抛出相同的异常。

因此,我计划制定一个异常处理策略,以便在引发异常时必须将其重定向到单独的异常处理代码(类似于单独的自定义异常处理库类)。所以它不应该在我的业务逻辑之内。

谁能建议我如何实现它以及处理我的异常是否是最好的主意?或者除了我的以外,有人可以建议我使用异常处理技术来执行此操作吗?

谢谢您,期待您的回复。


来自《Effective Java》(Joshua Bloch)

  • 仅在异常情况下使用 Exceptions(切勿用于普通控制流)
  • 对可恢复条件使用检查异常,对编程错误使用运行时异常。
  • 避免不必要地使用已检查异常

避免检查异常。

http://www.mindview.net/Etc/Discussions/CheckedExceptions http://www.mindview.net/Etc/Discussions/CheckedExceptions http://www.ibm.com/developerworks/java/library/j-jtp05254/index.html http://www.ibm.com/developerworks/java/library/j-jtp05254/index.html

  • 检查异常通常被许多人认为是一个有缺陷的功能。这不是一个坏主意,但人们并不真正了解如何使用它们。
  • 像 Spring、Hibernate 这样的 Java 框架......它们大多都会抛出未经检查的异常。
  • C# 没有故意实现检查异常。斯卡拉也没有。
  • 并不是因为它不受控制,所以你无法抓住它。
  • 并不是因为没有勾选所以不能翻译(换行)
  • 并不是因为它未经检查,所以它不是合同的一部分。事实上,您可以声明抛出未经检查的异常的方法。
  • 检查异常增加了客户端和库之间的耦合

需要理解的一件非常重要的事情是任何一段代码都可能产生异常。并不是因为一个方法声明抛出 IOException,它就不能抛出任何其他异常。它可以抛出任何其他运行时异常(通用或自定义)。对于受检查的异常,开发人员倾向于相反的想法,并认为捕获 IOException 将处理所有异常情况,但事实并非如此!


仅编译时功能

当您忘记捕获或重新抛出已检查的异常时,只有编译器会告诉您。在运行时,没有区别。

这意味着通过使用类型擦除技巧,您可以抛出已检查的异常,甚至不需要它成为方法契约的一部分。

您可以在此处找到此技巧的示例(称为 SneakyTrow):https://stackoverflow.com/a/4890489/82609 https://stackoverflow.com/a/4890489/82609

Lombok 还提供了一个 @SneakyThrow 注释来放置方法,这样您就不需要在方法签名中声明检查的异常。


仅当类客户端可能从异常中恢复时才使用已检查异常。

这是太阳的推荐。

基本上,尝试连接到数据库将引发检查异常,并且重试策略代码将在连接尝试时捕获这些检查异常。当超过重试次数时,重试策略将抛出未经检查的异常,这意味着它不是可恢复的异常,因为恢复策略已经被尝试过。 顺便说一下,您可以使用 Spring RetryTemplate 来实现这一点。


避免异常代码

异常类型应该足以用于流量控制决策。解析异常或流程控制只会创建无用的代码。添加更多异常类型,只要有异常代码即可。


快速失败

让所有不可恢复的异常被抛出到 IHM 层。 如果您使用声明检查异常的框架,并且没有针对它们的恢复策略,请毫不犹豫地将它们包装到未检查异常中。

如果您无法恢复,那么您不应该执行“捕获并记录”。或者更糟糕的是,您不应该执行“catch and return null”。这将产生不一致的软件,并且稍后您的程序中可能会出现另一个异常,但您将无法理解原因。返回 null 只会在稍后创建 NullPointerException。

IHM层技术可以具有异常处理程序/映射器。 Web IHM 层具有异常映射器,因此您可以说“此异常产生 404 错误”。


功能性方法

仅供参考:在函数式语言中,使用异常进行流量控制通常被认为是一种不好的做法。 我们通常不抛出异常,而是返回“增强类型”,例如 Either[Error,MyResultType]。

返回的实例要么是错误,要么是成功,成功是返回的 MyResultType 实例。


异常对于流量控制不具有性能

创建异常是有成本的(创建堆栈跟踪)。它的成本比使用 if, else 的正常流程要高得多... 如果可以避免,请勿将它们用于流量控制。

基本上,您基本上总是可以避免它们,但在 Java 中,在某些情况下使用它们进行流量控制有时可能更方便。在函数式语言中,Either monad 再次发挥作用。


使用断言

如果开发人员认为程序中的某些内容是正确的,请使用断言,以便保证您的断言是正确的。 看看番石榴先决条件:https://code.google.com/p/guava-libraries/wiki/PreconditionsExplained https://code.google.com/p/guava-libraries/wiki/PreconditionsExplained

或者您可以使用 Java 本机断言或一些自定义代码。 这有助于快速失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java异常处理策略[关闭] 的相关文章

  • Android蓝牙权限问题

    首先 抱歉我的英语不好 我是西班牙人 并且是 Android 开发的新手 我正在开发一个简单的蓝牙文件发送器 我基于BluetoothChat android示例一步一步 现在我向用户发出蓝牙激活请求 并选择是或否选项应用程序崩溃 我拥有清
  • 你们中有多少人进行三层设计?

    多年来 三层设计一直是我数据库驱动应用程序的标准设计理念 它从未让我失望过 对于那些练习它的人 描述一下你的层次 我发现很多人混淆了业务层和数据访问层 使其更像是 2 5 层设计 我更喜欢使用存储过程将数据层几乎完全移动到数据库中 并且在代
  • 是否有任何库可以解析Java中的“数字表达式”,例如1,2-9,33-

    我不认为这很难 只是写起来很乏味 一些小的免费 如啤酒 库 我可以在其中放入像 1 2 9 33 这样的字符串 它可以告诉我给定的数字是否与该数字匹配表达 就像大多数程序的打印范围对话框一样 仅匹配奇数或偶数 或匹配每个 2 mod 5 或
  • Tomcat 基于表单的身份验证出现 HTTP 状态 408 错误

    我的申请是写在JSP并且有基于表单的身份验证 我正在使用 Apache 和 Tomcat 7 这是我的问题 有时 当会话超时并尝试重新登录应用程序时 它会显示以下 408 错误消息 HTTP 状态 408 已超出登录过程允许的时间 如果您想
  • 为什么c#异常处理机制不捕获win32异常

    我有一个 winforms 应用程序 Winforms 从 Program cs 开始 我们在其中定义了 main 我已将此代码放在 try catch 块中 STAThread static void Main try Applicati
  • tbb:并行查找第一个元素

    我遇到了这个问题 查找列表中满足给定条件的第一个元素 不幸的是 该列表相当长 100 000 个元素 并且使用单个线程评估每个元素的条件总共需要大约 30 秒 有没有办法干净地并行化这个问题 我浏览了所有tbb模式 但找不到任何合适的 UP
  • 将 c++ 异常传播到 cython - python 异常

    我的 Cython 0 17 1 有问题 我的函数抛出一个std runtime error如果文件不存在 我想以某种方式将此异常传播到我的 Cython 代码 void loadFile const string filename som
  • Android:将声音保存为铃声/SQLiteConstraintException

    我正在尝试使用 Android 将声音保存为铃声this http www stealthcopter com blog 2010 01 android saving a sound file to sd from resource and
  • 是否可以手动检查 LocateRegistry 是否存在?

    I 已经发现 https stackoverflow com a 8338852 897090一种安全的方式获得LocateRegistry 即使注册表尚不存在 Registry registry null try registry Loc
  • 从一台服务器到多台可配置服务器的 JNDI 查找

    我们在具有不同 IP 的不同机器上有几个 JBoss 服务器 不是集群 而是属于不同客户的单个独立 JBoss 7 1 1 实例 所有系统上都部署了完全相同的 EAR 我们尝试发送一个名为Group从一个系统到另一个系统 问题 我们尝试了一
  • 这种模式叫什么?软锁?

    这是我有时必须编写的一些代码 大部分与 UI 内容结合使用 并且总是与可能意外陷入无限循环的事件相关 public class MyClass public event EventHandler MyEvent private bool I
  • 莫名其妙的 MissingFieldException

    在下面的代码片段中 它会抛出 MissingFieldException Field Not Found DepthBidLevels 异常 但仅在下面描述的某些奇怪情况下才会抛出 for int i DomSize 1 i gt 0 i
  • 断开连接期间处理 pyserial 中的异常

    我有从串口读取数据的代码 try dataIn self port read 100 except serial SerialException do some work return None 如果我断开设备连接 我会捕获我无法处理的异常
  • 捕获外部脚本文件中的 javascript 错误

    我有一点 JavaScript Jquery 工具的叠加层 http flowplayer org tools overlay index html 当放到错误使用它的页面上时可能会引发异常 我正在尝试优雅地处理它 我有一个通用的 wind
  • android 中的 lang.NumberFormatException

    我有以下代码 除了在后台线程中从数据库读取一些值并使用这些值之外什么也不做 我使用 jar 绘制折线图 对于我用于每个数组值的折线图 问题是第三个我传递给绘制 LineChart 的构造函数的参数是 float float viteza S
  • 更新面板异常处理

    当我在正在构建的 ASP NET Web 应用程序中实现的 UpdatePanel 中发生异常时 它们会导致页面上出现 JavaScript 错误 并在警报中提供一些高级错误输出 这对于开发来说还可以 但是一旦系统投入生产 由于多种原因 这
  • jsf文件下载不起作用

    当我点击h commandButton它执行myBean dowanlod 方法 但它不下载任何文件 这是我在支持 bean 中的方法 没有例外 光标变得忙碌 似乎在等待响应 对于这种操作是否有任何额外的配置或者这段代码有什么问题吗
  • 池和集群之间的区别

    从最纯粹的角度来看 它们感觉像是相同的概念 两者都管理资源 节点集并控制来自外部组件或由外部组件进行的访问 通过池 您可以向池借用这些资源 节点 也可以从池中归还这些资源 节点 对于集群 您在资源 节点前面有一个负载均衡器 并且您可以向负载
  • 空对象模式以避免空检查?

    最近 我遇到了空对象设计模式 我的同事说它可以用来消除整个代码中遇到的空指针检查 例如 假设 DAO 类返回有关 Customer 的信息 在名为 CustomerVO 的值对象中 我的主类应该提取名字和电子邮件 ID 并向客户发送电子邮件
  • Android:单一活动,多个视图

    我不是 Android 专业人士 尽管我开发了一个包含 50 多个活动的应用程序 这使得该应用程序非常庞大 经过8周的开发 现在出现了一些问题 导致应用程序难以维护和升级 我正在处理的主要问题是 我无法将对象引用传递给活动的构造函数 事实上

随机推荐

  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • 启用/禁用由用户输入确定的复选框

    我有一个简单的表单 用户可以在其中输入他的联系号码 如果联系号码以 07 开头 则该复选框已启用 其他我需要禁用它的复选框 我已经编写了一些代码 但我面临的问题是 当用户键入 01 时 它会被禁用 但如果他们继续在 01 之后添加任何其他数
  • Ionic 移动应用程序的 LocalForage 大小限制

    我正在使用 Ionic 框架构建移动应用程序 我的应用程序大量使用离线数据库 我的第一次尝试是使用ng存储 https github com gsklee ngStorage它使用 localStorage 但一段时间后我达到了大小配额限制
  • javascript jquery 使用脚本更改脚本的src

    我有一个 JavaScript 脚本 它有一个 src 元素 这个 src 是一个 url 我想使用 javascript 更改它 一次更改为其他内容 或者动态创建它 使用 javascript jquery 动态创建脚本元素的最佳方法是什
  • Python tkinter.filedialog Askfolder 干扰 clr

    我主要在 Spyder 中工作 构建需要弹出文件夹或文件浏览窗口的脚本 下面的代码在spyder中完美运行 在 Pycharm 中 askopenfilename工作良好 同时askdirectory什么都不做 卡住了 但是 如果在调试模式
  • azure webjob:读取 appSettings.json 并将配置注入 TimerTrigger

    我无法从 webjob 中的 appSettings json 文件读取配置值 webjob 使用以下 nuget 包 我的控制台应用程序 webjob 中有两个设置文件 应用程序设置 development json 应用程序设置 生产
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 小部件之间的自定义信号

    尝试将信号从一个 gtk EventBox 子级发送到另一个 在 init HeadMode 第 75 行 上出现错误 类型错误 未知信号名称 消息发送 why usr bin env python coding utf8 import p
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 在 MS Access SQL 查询中从正常日期转换为 unix 纪元日期

    我正在尝试编写一个通过 ODBC 连接到 MySQL 数据库的 MS Access 2007 连接的查询 一切工作正常 查询执行我想要的操作 我挂断的部分是我一直在询问用户 unix 纪元时间 而不是常规日期 我查找了 MS Access
  • 扩展 cordova gradle 文件以包含 google 服务

    我正在尝试包括com google gms google services 3 0 0进入我的cordova插件 而无需将其破解到主程序中build gradle文件 我已将以下文件添加到我的应用程序中 构建 extras gradle b
  • 从控制台检查 chrome 版本

    有没有办法从控制台检测 Google Chrome 的版本 我知道我可以解析用户代理字符串 但我更喜欢更简洁的方式 这是我目前拥有的 var uaStr navigator userAgent toLowerCase var index u
  • 如何在Python中高效地添加稀疏矩阵

    我想知道如何在Python中有效地添加稀疏矩阵 我有一个程序 可以将大任务分解为子任务 并将它们分配到多个 CPU 上 每个子任务都会产生一个结果 一个 scipy 稀疏矩阵 格式为 lil matrix 稀疏矩阵尺寸为 100000x50
  • shell脚本中的\r字符

    我在尝试执行 shell 脚本时收到以下错误 r command not found line 2 请提出同样的解决方案 以下是脚本中使用的初始行 bin sh if lt 1 then echo ERROR Environment arg
  • 增加 WPF 弹出动画的持续时间

    我有一个 WPF PopUp 控件 用于显示菜单叠加层 并且使用默认的淡入淡出动画 不过我想让动画需要更长的时间才能完成 我可以在 XAML 中做到这一点吗 你能在这里发布相关的xaml代码吗 否则 您可以查看这些链接以开始使用 xaml
  • 未捕获的异常“Google_IO_Exception”,消息为“HTTP 错误:无法连接”

    我有一个任务 查询 运行一些从 gmail 邮箱检索数据的 php 代码 直到上周五 2015 年 4 月 10 日 它一直工作正常 现在我收到以下错误日志 E 11 58 26 094 2015 04 15 200 3 38 KB 14
  • 如何在 Sails.js 中正确抛出和处理 Promise 中的错误?

    我开始将回调代码转换为 Sails js 中的承诺 但我不明白如何引发自定义错误并在承诺链中处理它们 Sails js 使用 Q 作为其 Promise 库 User findOne email req param professorEma
  • Python中列表中两个连续元素的平均值

    我有一个偶数个浮点数的列表 2 34 3 45 4 56 1 23 2 34 7 89 我的任务是计算 1 和 2 个元素 3 和 4 5 和 6 等元素的平均值 在 Python 中执行此操作的快捷方法是什么 data 2 34 3 45
  • 在docker容器中运行Jenkins有什么优势

    我发现了很多关于如何运行你的博客Jenkins in Docker但没有人真正解释这样做的好处 这是我发现的唯一原因 使用 Docker 的理由 https twasink net 2016 08 01 setting up a jenki
  • java异常处理策略[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi