Effective Java 第三版——75. 在详细信息中包含失败捕获信息
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. 在详细信息中包含失败捕获信息的更多相关文章
- Effective Java 第三版——46. 优先考虑流中无副作用的函数
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——16.在公共类中使用访问方法而不是公共属性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 《Effective Java 第三版》目录汇总
经过反复不断的拖延和坚持,所有条目已经翻译完成,供大家分享学习.时间有限,个别地方翻译得比较仓促,希望有疑虑的地方指出批评改正. 第一章简介 忽略 第二章 创建和销毁对象 1. 考虑使用静态工厂方法替 ...
- 《Effective Java 第三版》新条目介绍
版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...
- Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——10. 重写equals方法时遵守通用约定
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——14.考虑实现Comparable接口
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- 一、利用Python编写飞机大战游戏-面向对象设计思想
相信大家看到过网上很多关于飞机大战的项目,但是对其中的模块方法,以及使用和游戏工作原理都不了解,看的也是一脸懵逼,根本看不下去.下面我做个详细讲解,在做此游戏需要用到pygame模块,所以这一章先进行 ...
- HDU 3416 Marriage Match IV 【最短路】(记录路径)+【最大流】
<题目链接> 题目大意: 给你一张图,问你其中没有边重合的最短路径有多少条. 解题分析: 建图的时候记得存一下链式后向边,方便寻找最短路径,然后用Dijkstra或者SPFA跑一遍最短路, ...
- LYOI 2016 Summer 函数 【线段树】
<题目链接> 题目大意: fqk 退役后开始补习文化课啦,于是他打开了数学必修一开始复习函数,他回想起了一次函数都是 f(x)=kx+b的形式,现在他给了你n个一次函数 fi(x)=kix ...
- Codeforces 1037D【BFS】
<题目链接> 题目大意: 给你一颗树的所有边,这些边是无向的,然后给你一段BFS序列,BFS都以1为根节点,判断这段BFS序列是否合法. 解题分析: 就是模拟BFS,某个父亲节点的所有子节 ...
- 利用shell脚本实现nginx 的logs日志分割
Nginx 是一个非常轻量的 Web 服务器,体积小.性能高.速度快等诸多优点.但不足的是也存在缺点,比如其产生的访问日志文件一直就是一个,不会自动地进行切割,如果访问量很大的话,将 导致日志文件容量 ...
- jquery中,使用append增加新元素时,新增元素的绑定监听事件失效的解决办法
$("outerSelector").on("eventType","innerSelector",function(){}); 举例:如果 ...
- 2190 ACM 数学概率论的乘法和加法原则
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2190 思路:明显我们要寻找 边长为n和边长为n-1,n-2,n-3·····的规律,这样得出一个递推公式就 ...
- 3466 ACM Proud Merchants 变形的01背包
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3466 题意:假设你有M元,已经Pi,Qi,Vi(i为角标,1<i<N),当M>Qi,时才 ...
- 从零开始搭建一个从Win7环境备份至CentOS7的SVN双机备份环境
★几个关键的事项★ 需要关闭防火墙filewalld跟selinux ,在root用户下操作: [root@localhost svnRepos]# systemctl stop firewalld ...
- Safari 中加载 Flash 使用overflow失效的bug
在Flash标签中加入参数:wmode=transparent