当前位置: 首页 > 面试题库 >

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

芮明知
2023-03-14
问题内容

我认为人们普遍认为,作为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块,这些代码很可能掩盖了 实际
问题。再次以自己的例子,如果有什么调用_map.add()是抛出一个NullPointerException由于某种原因, 其他的
不是_map幸福null?突然,您正在静默地创建一个空的映射,而不是向其添加条目。我确定我真的不必说会由于意外状态而在代码中完全不相关的地方导致任何数量的错误…


编辑: 为了清楚起见,以上答案是在Java上下文中编写的。其他语言在例外的实现开销上可能(并且显然确实如此)有所不同,但其他观点仍然应该成立。



 类似资料:
  • 我已经用Java编写代码一段时间了。但有时,我不知道什么时候应该抛出异常,什么时候应该捕获异常。我正在做一个有很多方法的项目。层次结构是这样的- 所以目前我正在做的是-我在所有方法中抛出异常并在方法A中捕获它,然后将其记录为错误。 但我不确定这是否是正确的方法?或者我应该开始在所有方法中捕获异常。这就是为什么这种混乱始于我的 - 我什么时候应该抓住异常与何时应该抛出异常。我知道这是一个愚蠢的问题,

  • 什么时候才有理由将其添加到清单中。xml? 谢啦

  • 主要内容:Python语法错误,Python运行时错误开发人员在编写程序时,难免会遇到错误,有的是编写人员疏忽造成的语法错误,有的是程序内部隐含逻辑问题造成的数据错误,还有的是程序运行时与系统的规则冲突造成的系统错误,等等。 总的来说,编写程序时遇到的错误可大致分为 2 类,分别为 语法错误和 运行时错误。 Python语法错误 语法错误,也就是解析代码时出现的错误。当代码不符合 Python 语法规则时,Python解释器在解析时就会报出 Synt

  • 我有密码 我想知道抛出怎么会发生这种情况。这显然发生在我的应用程序的一个用户身上,但我无法跟踪出了什么问题。

  • 我在清理一些Java代码。有许多静态工厂方法都执行相同的异常处理。例如,考虑< code>createA: 有许多这样的方法(每个方法返回不同的类型)。对于这些方法中的每一个,都存在此异常处理的副本(即它是重复的)。我希望有一种方法可以避免所有这些相同的代码,并且只在一个地方有这个逻辑。 当然,在没有异常处理的情况下,您只需将逻辑提取到辅助函数并解决重复问题-这具有异常处理的事实使其与众不同。以下

  • 问题内容: 最近,我接受了公司的采访,他们给了我一个编码问题。我得到了与纸牌有关的程序,其中一种方法是将纸牌洗牌。因此,我将该程序编写为: 在上面的代码中,我引发了我最怀疑的 IllegalArgumentException 。在什么情况下实际上应该抛出运行时异常?我们是否应该实际抛出运行时异常? 谢谢 问题答案: 我们是否应该实际抛出运行时异常? 是的,我们应该。运行时异常有特定的用途-它们发出