Tips

书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code

注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本。

75. 在详细信息中包含失败捕获信息

当程序由于未捕获异常而失败时,系统自动打印出异常的堆栈轨迹 。堆栈轨迹包含异常的字符串表示,这是调用其toString方法的结果。这通常包括异常的类名及其详细信息。通常,这是程序员或网站可靠性工程师在调查软件故障时所掌握的唯一信息。如果失败不容易重现,则可能很难或不可能获得更多信息。因此,异常的toString方法返回尽可能多的关于失败原因的信息是非常重要的。换句话说,异常的详细信息应该捕获失败,以便后续分析。

要捕获失败,异常的详细消息应包含导致异常的所有参数和属性的值。 例如,IndexOutOfBoundsException的详细消息应包含下限,上限和不能在边界之间的索引值。 这些信息告诉了很多关于失败的信息。 三个值中的任何一个或全部都可能是错误的。 索引可能比下限小一或等于上限(“fencepost error”),或者它可能是一个野值(wild value),太低或太高。 下限可能大于上限(严重的内部不变失败)。 这些情况中的每一种都指向一个不同的问题,如果你知道正在寻找什么样的错误,它将极大地帮助你进行诊断。

有一个与安全敏感信息有关的警告。因为堆栈轨迹可能在诊断和修复软件问题的过程中被许多人看到,所以不要包括密码、加密密钥等详细信息

虽然在异常的详细信息中包含所有相关数据非常重要,但通常不需要包含大量的不相关的信息。堆栈轨迹与文档一起分析,如果需要,再与源代码一起分析。它通常包含抛出异常的确切文件和行号,以及堆栈上所有其他方法调用的文件和行号。冗长的描述失败信息是多余的;可以通过阅读文档和源代码来收集信息。

不应将异常的详细消息与用户级错误消息混淆,后者必须能够为最终被用户理解。 与用户级错误消息不同,详细消息主要是为了程序员或网站可靠性工程师在分析故障时的原因。 因此,信息内容远比可读性重要。 用户级错误消息通常是本地化的,而异常详细消息很少被本地化。

确保异常在其详细消息中包含足够的失败捕获信息的一种方法是,在其构造方法中,而不是字符串详细消息中要求此信息。 然后可以自动生成详细消息中包括该信息。 例如,IndexOutOfBoundsException可能有一个如下所示的构造方法,而不是String构造方法:

**
* Constructs 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(String.format(
"Lower bound: %d, Upper bound: %d, Index: %d",
lowerBound, upperBound, index));
// Save failure information for programmatic access
this.lowerBound = lowerBound;
this.upperBound = upperBound;
this.index = index;
}

从Java 9开始,IndexOutOfBoundsException最终获得了一个接受int值index参数的构造方法,但遗憾的是它删除了lowerBound和upperBound两个参数。更普遍地说,Java类库并没有大量使用这个习惯用法,但是强烈推荐使用它。它使程序员很容易抛出异常来捕获失败。事实上,它使程序员不想捕获失败都难!实际上,这个习惯用法将代码集中在异常类中生成高质量的详细信息,而不是要求该类的每个使用者都冗余地生成详细信息。

如条目 70所示,异常可能适合为其失败捕获信息(上例中的lowerBound,upperBound和index)提供访问器方法。 在检查异常上提供此类访问器方法比未检查异常更为重要,因为故障捕获信息可用于从故障中恢复。 程序员可能希望以编程方式访问未检查异常的细节,这种情况很少见(尽管也是可以想象的)。 但是,即使对于未检查异常情况,最好根据一般原则提供这些方法的访问器(条目 12,第57页)。

Effective Java 第三版——75. 在详细信息中包含失败捕获信息的更多相关文章

  1. Effective Java 第三版——46. 优先考虑流中无副作用的函数

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  2. Effective Java 第三版——16.在公共类中使用访问方法而不是公共属性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  3. 《Effective Java 第三版》目录汇总

    经过反复不断的拖延和坚持,所有条目已经翻译完成,供大家分享学习.时间有限,个别地方翻译得比较仓促,希望有疑虑的地方指出批评改正. 第一章简介 忽略 第二章 创建和销毁对象 1. 考虑使用静态工厂方法替 ...

  4. 《Effective Java 第三版》新条目介绍

    版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...

  5. Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  6. Effective Java 第三版——10. 重写equals方法时遵守通用约定

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  8. Effective Java 第三版——14.考虑实现Comparable接口

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

随机推荐

  1. soul

    mark,数据使用gzip加密,因为公司网络卡,明天后天看.

  2. Intellij IDEA更改项目优先编译顺序

    今天启动公司项目突然发现了一个问题,类里面明明有这个方法,但是无论怎样都不编译.(由于公司项目是二次开发,代码都是第三方写的,代码请勿仔细看,怕伤了你的眼睛.) 如图,找不到setJGMC方法. 但是 ...

  3. [Python] dict对象的keys()和values()返回的值,是否总是保证一一对应?

    搜dict的key, value顺序, 中文没搜到想要的结果. 英文答案链接:python-dictionary-are-keys-and-values-always-the-same-order 在 ...

  4. 字节跳动冬令营网络赛 D.The Easiest One(贪心 数位DP)

    题目链接 \(x:\ 11010011\) \(y:\ 10011110\) (下标是从高位往低位,依次是\(1,2,...,n\)) 比如对于这两个数,先找到最高的满足\(x\)是\(0\),\(y ...

  5. 2160 母猪的故事 ACM 数学规律

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2160 中文题目,很简单,找规律就好. 自己画树状图找规律,开始想复杂了,找的规律:Fn=2*F(n-1)- ...

  6. No compiler is provided in this environment.Perhaps you are running on a JRE rather than a JDK?报错解决

    Maven install 时出现如上错误. Eclipse-->Window-->preferences-->Java-->Installed JREs 查看jdk: 发现此 ...

  7. scrapy中间件

    一.下载中间件 from scrapy import signals from scrapy.http import Response from scrapy.exceptions import Ig ...

  8. 第一本docker书,,持续更新中

    1.查看应用是否在docker中部署成功 需要确认curl已安装 whereis curl sudo apt-get -y install curl curl localhost:8081   如果成 ...

  9. [P3613]睡觉困难综合征

    Description: 给定一个n个点的树,每个点有一个操作符号 "&" "|" "^" ,以及一个权值 要求支持以下操作: 1. ...

  10. tcp协议下粘包问题的产生及解决方案

    1 tcp有粘包及udp无粘包 - TCP 是面向连接的,面向流的可靠协议:发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据, 合并成 ...