什么时候可以对业务逻辑使用异常处理?

2024-02-02

我认为,作为 Java(或许还有任何具有异常处理的语言)的一般规则,人们应该尽量避免使用异常处理来实际处理业务逻辑。一般来说,如果预计会发生某种情况,那么应该比依赖异常处理来更直接地检查并处理它。例如,以下行为不被视为良好做法:

try{
  _map.put(myKey, myValue);
} catch(NullPointerException e){
  _map = new HashMap<String, String>();
}

相反,延迟初始化应该更像这样完成:

if(_map == null){
  _map = new HashMap<String, String>();
}
_map.put(myKey, myValue);

当然,可能有比简单处理延迟初始化更复杂的逻辑。因此,考虑到这种类型的事情通常不受欢迎……什么时候(如果有的话)依靠发生的异常来实现某些业务逻辑是一个好主意?如果有人觉得不得不使用这种方法,那么可以准确地说,这确实凸显了所使用的 API 的弱点吗?


每当异常可以预见但无法避免时。

比如说,如果您依赖某种外部 API 来解析数据,并且该 API 提供了解析方法,但没有说明给定的输入是否可以解析(或者解析是否成功取决于因素) (但 API 不提供适当的函数调用),并且当无法解析输入时,解析方法会抛出异常。

通过正确设计的 API,这应该归结为“几乎从不”到“从不”范围内的某个数量。

我认为绝对没有理由使用异常处理作为代码中正常流程控制的手段。它很昂贵,很难阅读(只要看看你自己的第一个例子;我意识到它可能写得很快,但是当_map还没有初始化,你最终得到的是一个空的映射,扔掉了你试图添加的条目),并且它在代码中散布着大量无用的 try-catch 块,这些块可以很好地隐藏real问题。再次以您自己的例子为例,如果调用_map.add()是要扔一个NullPointerException因为某些原因other than _map being null?突然间,您默默地重新创建了一张空地图,而不是向其中添加条目。我确信我不必说,由于意外的状态,这可能会导致代码中完全不相关的地方出现许多错误......

Edit:需要明确的是,上面的答案是在 Java 上下文中编写的。其他语言可能(而且显然确实)在异常的实现开销方面有所不同,但其他点仍然应该成立。

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

什么时候可以对业务逻辑使用异常处理? 的相关文章

随机推荐

  • 如何使用 std::atomic 实现可重用的线程屏障

    我有 N 个线程执行各种任务 这些线程必须定期与线程屏障同步 如下图所示 有 3 个线程和 8 个任务 表示时间屏障 所有线程必须等到8个任务完成才能再次启动 Thread 1 task1 task6 wait taskB Thread 2
  • 如何一个接一个地运行参数化作业(没有参数)

    我在 Jenkins 有一份工作 有 2 个参数 我想运行另一个没有参数的计划 并从该计划中根据需要多次启动现有计划 新计划需要安排每 15 分钟运行一次 将由 Jenkins 的调度程序选项完成 该计划的代码将 连接到数据库 获取所需的记
  • 如何进行字段枚举迁移 yii2

    我做了字段ENUM 当我使用时结果是错误的yii migrate up在 CMD 窗口上 public function up tableOptions null if this gt db gt driverName mysql tabl
  • 在 c 中使用 malloc 实现堆栈 [初学者]

    出于学习目的 我正在用 c 语言实现一个堆栈及其函数 我添加了一些小的附加功能来第一次使用 malloc 并尝试正确理解它 我编写了一个最初创建堆栈结构的函数 该函数的返回值是一个具有已分配内存的新结构 在返回值应该是结构的函数中处理 ma
  • 如何在 emacs-ess 中的 R 会话之间切换?

    我在 Emacs ESS 中打开了两个会话 一个在我的桌面上 另一个在使用 trapmp 的服务器上 我如何告诉 ESS 使用哪个会话 嗯 我用 M x ess switch process 一直在 Emacs 内的 本地 R 会话之间切换
  • 无法读取 Zsh 历史记录的时间戳

    Problem 了解以下时间戳 1241036430 在 history 1241036336 0 vim zshrc 1241036379 0 vim bin HideTopBar 1241036421 0 ls 1241036430 0
  • Scala fat jar 中的 ExecutionInterceptorChain 中缺少 AWS SDK 执行拦截器

    我对 scala java sbt 相当陌生 这是我第一次调试通过 sbt 在 scala 中运行的代码与从编译的 jar 运行的相同代码之间的差异 我有一些 Scala 代码 它利用 AWS Java SDK 发出一些 S3 请求 当我使
  • 使用 p4merge 作为 git diff 工具

    I use windows 7 我想用p4merge作为 Git 差异 合并工具 我跟随本文 https danlimerick wordpress com 2011 06 19 git for window tip use p4merge
  • 正则表达式仅捕获匹配中捕获组的最后一个实例

    我有以下两种不同语言的正则表达式 它们产生相同的奇怪结果 javaScript 和 Flash 我想知道的不是如何解决它 而是为什么会发生这种行为 正则表达式 2 这里的目标是匹配括号内的字符串 并确保我不会停在转义括号处 如果我有文本输入
  • bash 脚本中的双感叹号

    我知道当打印双感叹号时 它会执行前面的命令 但是回声 给出了一些我不明白的奇怪结果 例如 当在 bash 脚本中键入以下命令时 它也会打印 echo 作为输出的一部分 echo echo This prints the below outp
  • PRISM + MEF -- 导入和导入Many

    FooService cs public interface IFooService int Foo Export Foo1 typeof IFooService public class Foo1 IFooService public i
  • 向多个用户显示由另一个用户插入的数据更新

    我需要在用户输入数据库时 立即向用户显示更新的数据 即在线视图 我正在使用 sql server 并构建一个 c net winform 应用程序 该应用程序将由 3 个用户 U1 U2 U3 在 LAN 上使用 用户将使用应用程序将数据输
  • 如何使用 WebDriver 在 PhantomJS 中处理/接受 JS 警报?

    作为 Selenium 的 PhantomJSDriver 新手 它如何处理 JS 警报 我找到了 JSPhantomonAlert http phantomjs org api webpage handler on alert html文
  • 如何在 Nuxt 中使用猫头鹰旋转木马?

    我想让脚本在每个页面上工作 而不需要加载这些页面 我的静态文件夹中有 owl caroussel 脚本 我已经将其放入 nuxt config js 中 我的放置方式如下 head title title htmlAttrs lang en
  • 可以在单个查询中使用多个数据库吗?

    PHP 如何在一条语句中查询两个数据库的数据 请给我简单的方法 以及如何连接2个数据库来使用它 谢谢 可以在一个查询中使用来自不同数据库的数据库表 if您当前的连接可以访问这两个数据库 您只需在每个表名前加上数据库名称作为前缀即可 SELE
  • Typescript 接口类型,具有不同类型的可选键和 strictNullChecks

    我正在尝试在打字稿中创建以下界面 type MoveSpeed min road full interface Interval min number max number interface CreepPlan partName stri
  • 如何将独立的散景图嵌入到 django 模板中

    我想通过 django 框架在我的 Web 应用程序中显示 bokeh 库提供的图表 但我不想使用 bokeh server 可执行文件 因为这不是好方法 那么这可能吗 如果是的话该怎么做 使用嵌入散景图 http docs bokeh o
  • 为什么这段代码可以删除副本? [复制]

    这个问题在这里已经有答案了 可能的重复 构造函数调用机制 https stackoverflow com questions 4283576 constructor invocation mechanism 为什么使用空括号调用不带参数的构
  • Visual Studio 无法部署到 HoloLens:错误 DEP6957:无法连接到设备

    我在将 Hololens Academy 模块 Hololens 210 部署到 Hololens 设备时遇到问题 它会要求输入密码 我输入它但失败了 我可以很好地在模拟器中部署和运行 我可以确保计算机位于同一网络上 并且我将 Holole
  • 什么时候可以对业务逻辑使用异常处理?

    我认为 作为 Java 或许还有任何具有异常处理的语言 的一般规则 人们应该尽量避免使用异常处理来实际处理业务逻辑 一般来说 如果预计会发生某种情况 那么应该比依赖异常处理来更直接地检查并处理它 例如 以下行为不被视为良好做法 try ma