Effective Java(2nd Edition) Item 63 译文

因未捕获异常而导致程序运行失败时,系统会自动打印异常的堆栈踪迹(stack trace),堆栈踪迹中包含了该异常的字符串表示,该字符串就是调用toString方法的结果。典型的,它包括异常的类名,接着是详细信息(detail message)。通常详细信息是程序员或现场服务人员(field service personnel)在研究软件失败时所能获得的唯一信息。如果失败不能轻易再现,就不大可能获得更多信息。因此,toString方法能返回关于失改原因尽量多的信息就显得更为重要。换句话说,异常的详细信息应能用于分析捕获的错误。

       为了能分析错误原因,异常的详细信息应包含所有与异常相关的参数或域的值。例如,IndexOutOfBoundsException的详细信息应包括下界、上界,及不在上下界间的索引值。这些信息给出了失败的许多信息。三个值中的任一个都可能会出错。实际索引值可能小于下界或等于上界((a fencepost error),),或者它是一个不切实际(wild)的值,太小或太大。下界的值可能大于上界的值(一个严重的内部不变量的错误)。每个情况代表了不同的问题,这些信息有助于程序员查找发生了哪种错误。

       虽然,在异常的详细信息中包含相关的“hard data”是必不可少的,但包含许多散文式的描述就不太必要。堆栈踪迹通常与源程序结合在一起分析,堆栈踪迹还包括了异常发生的文件,行数,以及在该堆栈上调用的所有其它方法所在的文件与行数,对失败进行大量的散文式的描述通常是多余的,这些信息可以通过阅读源代码获得。

 

       异常的详细信息不应与用户级的错误信息混淆,用户级的错误信息对终端用户应是可理解的。与用户级错误信息不同,异常的详细信息主要有助于程序员或现场服务人员对错误进行分析。因此信息的内容比信息的可理解性更重要。

 

       为确保异常的详细信息中包含了能充分捕获错误的信息,一种方法是在异常的构造器中包括这些信息,而不是用一个字符串来描述。从而可以自动生成字符串来包含异常的详细信息。例如,IndexOutOfBoundsException的构造器可以不用String为参数,而可以是这样的:

 

/**

* Construct an IndexOutOfBoundsException.

*

* @param lowerBound the lowest legal index value.

* @param upperBound the highest legal index value plus one.

* @param index the actual index value.

*/

public IndexOutOfBoundsException(int lowerBound, int upperBound, int index) {

       // Generate a detail message that captures the failure

       super("Lower bound: " + lowerBound +

              ", Upper bound: " + upperBound +

              ", Index: " + index);

       // Save failure information for programmatic access

       this.lowerBound = lowerBound;

       this.upperBound = upperBound;

       this.index = index;

}

       不幸的是,在Java平台库中没有大量的使用这种习惯用法,但这种习惯用法值得推荐。这使得程序员捕获抛出异常的错误变得容易,事实上,这倒使程序员不捕获异常的错误反面是困难的。该习惯用法还使生成关于异常的高质量的详细信息的代码就在异常类内,从而避免了这个类的每个使用者都要重复地生成这样的详细信息。

       正如在Item 58中所建议的,为异常的捕获错误信息(上例中的lowerBound, upperBound,

and index)提供访问方法是合适的,因为failure-capture信息对恢复错误可能是有用的,所以与未受检查的异常相比,在受检查的异常中提供这样的方法更重要,程序员想通过编程方法获得未检查的详细信息是不多见的(尽管不是不可想象),然而,根据(Item 10,第53)所述的一般原则,对未受检查的异常提供访问方法也是可取的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值