20150704 星期六 北京
程序为捕获的异常而失败,系统会自动打印该异常的堆栈轨迹,在堆栈中包含该异常的字符串表示法(它的toString方法结果,包含类名,消息细节)
因此对于程序开发者或者运维人员,异常类型的toString方法应该尽可能返回有关联失败原因的信息,即异常的细节消息应该捕获住失败,便于以后分析.
为了捕获失败,异常的细节信息应该包括所有”对该异常有贡献”的参数和属性值.例如数组下标越界异常的细节应该包括下界,上界,以及没有落在界内的下标值.那么开发人员可以很快查找错误,加速诊断过程.
异常的细节信息,给软件使用者的消息必须是可理解的;给开发和维护人员的信息是用来分析失败原因的,因此信息内容比可读性更重要.
如何在确保确保异常信息中包含足够捕获失败的信息呢?
在异常的构造器而不是字符串细节中引入异常信息,然后进行消息描述.
(很遗憾jdk1.6-1.8的源码和作者的举例已经完全不同!)
参考作者举例
IndexOutOfBoundsException中并不是有String的构造器,而是有这样的构造器.(构造器==构造方法)
public IndexOutOfBoundsException (int lowerBound, int upperBound, int index) {
super("lowerBound: " + lowerBound + "upperBound: " + upperBound + "index: " + index);
this. lowerBound = lowerBound;
this. upperBound = upperBound;
this. index = index;
}
Java平台没有广泛使用这种做法,这种做法值得推荐,使开发人员容易捕获失败(为啥呢,从jdk1.6构造方法就和此构造器不同,是不是在1.6之前采用此方法呢?).
这种做法可以有效把代码集中在异常类中,产生高质量的细节,而不是要求每个客户多余地产生类的细节消息.
为异常的”失败捕获”信息提供访问方式是合适的, 对检查时异常提供访问方法非常重要;对运行时异常,作为一般原则提供这些访问方法同样是明智的.
{你如何使用上面的知识呢?
1.异常细节包含对该异常有用的参数和属性的值
2.新构建的异常类中包含导致此异常原因的属性,抛出(检查or运行)异常时对各个属性赋值足够有价值的数据
3.异常给客户的信息和给开发维护人员的信息不同,给客户信息要求可理解的,给开发人员的信息内容高于可理解}