什么时候应该创建一个检查异常,什么时候应该创建一个运行时异常?
例如,假设我创建了以下类:
public class Account {
private float balance;
/* ... constructor, getter, and other fields and methods */
public void transferTo(Account other, float amount) {
if (amount > balance)
throw new NotEnoughBalanceException();
/* ... */
}
}
我应该如何创建我的NotEnoughBalanceException
?它应该扩展Exception
还是RuntimeException
?还是我应该只使用它IllegalArgumentException
?
在这个话题上有很多分歧。在我的上一份工作中,我们遇到了一些实际问题,运行时异常被遗忘了,直到它们出现在生产环境中(在ageswards.com上),因此我们决定只使用已检查的异常。
在我目前的工作中,我发现在很多情况下都有很多人遇到运行时异常。
我的想法是:使用CheckedExceptions,我被迫在编译时至少要在调用方中确认异常。有了Runtime异常,编译器并没有强制我执行此操作,但是可以编写一个使我能够处理的单元测试。由于我仍然相信,早日发现错误,修复它的成本就更低,因此,我更喜欢CheckedExceptions。
从哲学的角度来看,方法调用是调用者和被调用者之间某种程度的契约。由于编译器强制使用传入的参数类型,因此让其在输出时强制使用这些类型似乎是对称的。也就是说,返回值或异常。
我的经验告诉我,当我使用检查的异常时,我得到的质量更高,即代码可以正常工作。受检查的异常可能会使代码混乱,但是有一些技术可以解决此问题。我喜欢在传递图层边界时翻译异常。例如,如果我要离开持久层,我想将SQL异常转换为持久性异常,因为下一层不关心我要持久存储到SQL数据库,但希望知道是否不能持久。我使用的另一种技术是创建简单的异常层次结构。这使我可以更清晰地编写更清晰的代码,因为我可以捕获超类,并且仅在真正重要时才处理各个子类。
问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮助。但是,在发送流数据时,等待A
问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或
我已经用Java编写代码一段时间了。但有时,我不知道什么时候应该抛出异常,什么时候应该捕获异常。我正在做一个有很多方法的项目。层次结构是这样的- 所以目前我正在做的是-我在所有方法中抛出异常并在方法A中捕获它,然后将其记录为错误。 但我不确定这是否是正确的方法?或者我应该开始在所有方法中捕获异常。这就是为什么这种混乱始于我的 - 我什么时候应该抓住异常与何时应该抛出异常。我知道这是一个愚蠢的问题,
问题内容: 最近,我接受了公司的采访,他们给了我一个编码问题。我得到了与纸牌有关的程序,其中一种方法是将纸牌洗牌。因此,我将该程序编写为: 在上面的代码中,我引发了我最怀疑的 IllegalArgumentException 。在什么情况下实际上应该抛出运行时异常?我们是否应该实际抛出运行时异常? 谢谢 问题答案: 我们是否应该实际抛出运行时异常? 是的,我们应该。运行时异常有特定的用途-它们发出
问题内容: 在集成我以前从未使用过的Django应用程序时,我发现了用于定义类中函数的两种不同方式。作者似乎非常有意地使用了它们。第一个是我自己经常使用的: 另一个是我不使用的,主要是因为我不知道何时使用它,以及什么用途: 在Python文档中,装饰器的解释如下: 类方法将类作为隐式第一个参数接收,就像实例方法接收实例一样。 所以我想指的是自己(而不是实例)。我不完全理解为什么会这样,因为我总是可
最近,我收到了在代码中使用's的建议,或者在站点上看到了一些使用's的答案--应该是某种容器。但是--我在C++17标准库里找不到类似的东西。 那么这个神秘的是什么?如果它是非标准的,为什么(或何时)使用它是个好主意?