在Java中创建Exception的一般规则是什么?

pek*_*pek 19 java exception

我遇到过这两种情况:

  • 创建过多的自定义异常
  • 使用太多的一般Exception类

在这两种情况下,项目都开始运行,但很快就成了维护(和重构)的开销.

那么关于创建自己的异常类的最佳实践是什么?

Jos*_*own 17

Java专家写了一篇关于Java中的异常的文章,其中列出了一些创建例外的"最佳实践",总结如下:

  • 不要编写自己的异常(有很多有用的异常已经是Java API的一部分)

  • 编写有用的异常(如果您必须编写自己的异常,请确保它们提供有关所发生问题的有用信息)


小智 14

不要做我公司的开发人员做的事情.有人创建了[sic] InvalidArguementException,它与java.lang.IllegalArgumentException相似,现在我们在(字面上)数百个类中使用它.两者都表明方法已被传递为非法或不恰当的参数.谈论浪费......

Joshua Bloch在" 有效Java编程语言指南" [最新实践的第一手段] 第8章中介绍了这一点.例外 项目42:支持使用标准异常.这是他说的一点,

重用先前存在的异常有几个好处.其中最重要的是,它使您的API更容易学习和使用,因为它符合程序员已经熟悉的既定惯例 [ 我的重点,而不是Bloch的 ].紧接其后的是,使用您的API的程序更容易阅读,因为它们不会被不熟悉的异常所混淆.最后,更少的异常类意味着更小的内存占用和更少的加载类所花费的时间.

最常见的重用异常是IllegalArgumentException.当调用者传入一个值不合适的参数时,这通常是抛出的异常.例如,如果调用者在表示某个操作要重复的次数的参数中传递一个负数,则抛出此异常.

也就是说,你永远不应该抛出异常.Java有一个精心挑选,多样化且目标明确的一系列内置异常,涵盖大多数情况描述发生的异常,以便您可以纠正原因.

对那些必须在将来维护代码的程序员友好.


Lan*_*uhn 8

我的经验法则是当客户端(调用者)可能合理地想要做一些不同的事情时,根据抛出的异常类型,保证附加的异常类型.但是,通常不需要额外的异常类型.例如,如果调用者正在编写代码

try {
     doIt();
} catch (ExceptionType1 ex1) {
     // do something useful
} catch (ExceptionType2 ex2) {
     // do the exact same useful thing that was done in the block above
}
Run Code Online (Sandbox Code Playgroud)

那么显然不需要额外的异常类型.我经常看到(或者被迫编写)这样的代码,因为被调用的代码在创建新的异常类型时过于热心.

  • 我知道这个问题已经有7年了,java 7当时还没有出现,但它仍然会出现在谷歌中...所以...使用java 7你可以合并这两个博客. (4认同)

jjn*_*guy 7

如果我找不到一个具有描述错误类型的名称的异常,那么我自己制作.

这是我的规则 - 拇指.


Kon*_*lph 5

基本上,每项工作都应该有自己的例外。当您捕获异常时,您不会像通常处理对象那样区分不同的实例,因此您需要不同的子类型。我认为使用太多自定义异常的情况几乎不会发生。

一个建议是根据需要创建异常,如果一种异常类型明显与另一种异常类型重复,则通过合并这两种异常来重构代码。当然,如果从一开始就考虑构建异常,这会有所帮助。但一般来说,对于与现有的特定情况异常没有 1:1 对应关系的所有情况都使用自定义异常。

另一方面,NullPointerExceptions 和IndexOutofBoundsExceptions 实际上通常可能是合适的。不过,不要捕获这些(日志记录除外),因为它们是编程错误,这意味着抛出它们后,程序处于未定义状态。