75. 在细节消息中包含失败一捕获信息

      为了捕获失败,异常的细节信息应该包含“对该异常有贡献”的所有参数和字段的值。 例如, 异常的细节消息应该包含下界、上界以及没有落在界内的下标值。该细节消息提供了许多关于失败的信息。这三个值中任何一个或者全部都有可能是错的。实际的下标值可能小于下界或等于上界(「越界错误」),或者它可能是个无效值,太小或太大。下界也有可能大于上界(严重违反内部约束条件的一种情况) 。每一种情形都代表了不同的问题,如果程序员知道应该去查找哪种错误,就可以极大地加速诊断过程。

      虽然在异常的细节消息中包含所有相关的数据是非常重要的,但是包含大量的描述信息往往没有什么意义。堆栈轨迹的用途是与源文件结合起来进行分析,它通常包含抛出该异常的确切文件和行数,以及堆校中所有其他方法调用所在的文件和行数。关于失败的冗长描述信息通常是不必要的,这些信息可以通过阅读源代码而获得。

      为了确保在异常的细节消息中包含足够的失败- 捕捉信息, 一种办法是在异常的构造器而不是字符串细节消息中引人这些信息。然后,有了这些信息,只要把它们放到消息描述中,就可以自动产生细节消息。例如 使用如下构造器代替 构造器:

      正如第 70 条中所建议的, 为异常的失败- 捕获信息(在上述例子中为 lowerBound 、upperBound 和 index)提供一些访问方法是合适的。提供这样的访问方法对受检的异常,比对未受检异常更为重要,因为失败一捕获信息对于从失败中恢复是非常有用的。程序员希望通过程序的手段来访问未受检异常的细节,这很少见 (尽管也是可以想象的) 。然而,即使对于未受检异常,作为一般原则提供这些访问方法也是明智的 (详见第 12 条) 。