我遇到过这两种情况:
创建过多的自定义异常
使用太多的一般Exception类
在这两种情况下,项目都开始运行,但很快就成了维护(和重构)的开销.
那么关于创建自己的异常类的最佳实践是什么?
Java专家写了一篇关于Java中的异常的文章,其中列出了一些创建例外的"最佳实践",总结如下:
不要编写自己的异常(有很多有用的异常已经是Java API的一部分)
编写有用的异常(如果您必须编写自己的异常,请确保它们提供有关所发生问题的有用信息)
不要做我公司的开发人员做的事情.有人创建了[sic] InvalidArguementException,它与java.lang.IllegalArgumentException相似,现在我们在(字面上)数百个类中使用它.两者都表明方法已被传递为非法或不恰当的参数.谈论浪费......
Joshua Bloch在" 有效Java编程语言指南" [最新实践的第一手段] 第8章中介绍了这一点.例外 项目42:支持使用标准异常.这是他说的一点,
重用先前存在的异常有几个好处.其中最重要的是,它使您的API更容易学习和使用,因为它符合程序员已经熟悉的既定惯例 [ 我的重点,而不是Bloch的 ].紧接其后的是,使用您的API的程序更容易阅读,因为它们不会被不熟悉的异常所混淆.最后,更少的异常类意味着更小的内存占用和更少的加载类所花费的时间.
最常见的重用异常是IllegalArgumentException.当调用者传入一个值不合适的参数时,这通常是抛出的异常.例如,如果调用者在表示某个操作要重复的次数的参数中传递一个负数,则抛出此异常.
也就是说,你永远不应该抛出异常.Java有一个精心挑选,多样化且目标明确的一系列内置异常,涵盖大多数情况并描述发生的异常,以便您可以纠正原因.
对那些必须在将来维护代码的程序员友好.
我的经验法则是当客户端(调用者)可能合理地想要做一些不同的事情时,根据抛出的异常类型,保证附加的异常类型.但是,通常不需要额外的异常类型.例如,如果调用者正在编写代码
try { doIt(); } catch (ExceptionType1 ex1) { // do something useful } catch (ExceptionType2 ex2) { // do the exact same useful thing that was done in the block above }
那么显然不需要额外的异常类型.我经常看到(或者被迫编写)这样的代码,因为被调用的代码在创建新的异常类型时过于热心.
如果我找不到一个具有描述错误类型的名称的异常,那么我自己制作.
这是我的规则 - 拇指.