上下文异常中的上下文属性

Allison Anders等人的《四个房间》(1995)。

我不断重复同样的错误。

因此,该停止并制定规则以防止这种情况了。

错误不是致命的,但很烦人。

当查看生产日志时,经常会看到类似"File doesn't exist" ,并且我问自己:什么文件?

它应该在哪里存在?

服务器尝试使用它做什么?

崩溃前一秒钟发生了什么?

日志中没有答案,这完全是我的错。

我要么1)不重新抛出,要么2)在不提供上下文的情况下重新抛出。

两者都是错的。

代码如下所示:

if (!file.exists()) {throw new IllegalArgumentException("File doesn't exist");
}

它也可能看起来像这样:

try {Files.delete(file);
} catch (IOException ex) {throw new IllegalArgumentException(ex);
}

这两个示例都说明了处理涉及异常并报告异常的情况的风格不足。 怎么了 异常消息不够彻底。 它们根本不包含来自其来源的任何信息。

他们应该这样看:

if (!file.exists()) {throw new IllegalArgumentException(String.format("User profile file %s doesn't exist",file.getAbsolutePath()));
}

第二个示例应如下所示:

try {Files.delete(file);
} catch (IOException ex) {throw new IllegalArgumentException(String.format("Can't delete user profile data file %s",file.getAbsolutePath()),ex);
}

看到不同? 这看起来像是冗余代码,但事实并非如此。 当然,当我编写所​​有这些内容时,我并不真正在乎日志和异常。 我并不是真的希望这个文件不存在。

但是我应该。

应该有一条规则:每次我们抛出或重新抛出异常消息时,都必须尽可能详细地描述问题。

当然,我们不能忘记安全性和冒着将任何敏感信息(例如密码,信用卡号等)放入异常消息中的风险。此外,必须在更高级别上尽可能多地向异常捕获程序公开这些信息。

抛出异常实际上是将问题升级到更高级别的管理。 想象一下,老板要我安装新服务器。 几小时后我回到他身边说:“我失败了;我失败了。 抱歉。” 听起来很奇怪。 他会要求更多细节。 为什么我失败了? 到底出了什么问题? 可以做不同的事情吗? 等等。

这样的代码实际上是对客户不尊重的标志:

throw new IllegalArgumentException("File doesn't exist"
);

我必须更加详细,并提供更多细节。

我不是一个人犯这个错误。 我到处都看到它,这确实使调试变得困难,尤其是在生产中,几乎不可能立即重现该问题。

因此,请在您的异常消息中更加详细。 我将在代码中执行相同的操作:)

还有一件事,然后再走。 在大多数OOP语言中,未检查异常是不幸的 ,这意味着捕获异常不是强制性操作。 尽管如此,我还是建议您始终捕获,添加上下文并重新抛出它们。 这似乎是纯噪声,但事实并非如此! 只是使您的方法更小,并确保从它们发出的所有异常都具有有关其来源的足够信息。 您将为自己和其他人带来很大的帮助。

翻译自: https://www.javacodegeeks.com/2015/12/throwing-exception-without-proper-context-bad-habit.html

上下文异常中的上下文属性

上下文异常中的上下文属性_在没有适当上下文的情况下引发异常是一种不良习惯...相关推荐

  1. 在没有适当上下文的情况下引发异常是一种不良习惯

    Allison Anders等人的<四个房间>(1995). 我不断重复同样的错误. 因此,该停止并制定规则以防止这种情况了. 错误不是致命的,但很烦人. 当查看生产日志时,经常会看到类似 ...

  2. java中如何把时间封装成类,java-如何在不使用任何不推荐使用的类的情况下将日期从一种格式转换为另一种格式的日期对象?...

    java-如何在不使用任何不推荐使用的类的情况下将日期从一种格式转换为另一种格式的日期对象? 我想将date1格式的日期转换为date2格式的日期对象. SimpleDateFormat simple ...

  3. mysql 开发 生产_在没有表锁定的情况下在巨大的MySQL生产表...

    [2017]更新:MySQL 5.6支持在线索引更新 In MySQL 5.6 and higher, the table remains available for read and write o ...

  4. kafka中topic默认属性_分享:Kafka 的 Lag 计算误区及正确实现

    前言 消息堆积是消息中间件的一大特色,消息中间件的流量削峰.冗余存储等功能正是得益于消息中间件的消息堆积能力.然而消息堆积其实是一把亦正亦邪的双刃剑,如果应用场合不恰当反而会对上下游的业务造成不必要的 ...

  5. 编写脚本电脑怎么编写界面_在任何无法理解的情况下,请编写脚本

    编写脚本电脑怎么编写界面 脚本编写是使您的应用程序在运行时就可根据客户需求进行调整的最流行的方法之一. 与往常一样,此方法不仅带来好处,例如,在灵活性和可管理性之间存在众所周知的折衷方案. 本文不是从 ...

  6. 摄像头取流转发 嵌入式系统_如何在不转发的情况下嵌入某人的Twitter视频

    摄像头取流转发 嵌入式系统 Justin Duino 贾斯汀·杜伊诺(Justin Duino) Sharing a video you saw on Twitter doesn't require ...

  7. 在多重Catch的情况下得到异常的完整信息

    在方法多层调用的时候,每一层都有相应的catch处理后重新throw的情况下,刚开始在最外层无法得到产生异常的完整信息. 最初的代码样子如下: static void Main(string[] ar ...

  8. 线程池中运行的线程,当等待队列未满的情况下,一定不大于核心线程数吗

    通过<线程池内运行的线程抛异常,线程池会怎么办>了解到当线程执行的任务出现异常时,会将当前线程移出线程池,并新增一个线程到线程池中,我们先来回顾一下线程池的运行原理: 从原理图中可以看到只 ...

  9. 如何根据分页的当前页数查询数据_数据量很大的情况下,如何分页查询优化方案?...

    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的一些方 ...

最新文章

  1. 系统优化方法与智能优化算法
  2. Hibernate中常用对象、方法、属性的理解
  3. eclipse java 1.8 vm_GGTS(Eclipse)和JAVA 1.8中不兼容的JVM
  4. Table Controls in ABAP Programs
  5. linux usb ga驱动详解,Linux设备驱动之内存映射
  6. php高效下载文件,LinkCache
  7. resteasy_RESTEasy教程第2部分:Spring集成
  8. [Lucene.Net] 基本用法
  9. TypeScript笔记 5--变量声明(解构和展开)
  10. 1、和一定时找数组中的两个数
  11. 优秀程序设计的原则(可以多读读)
  12. 恒指交易如何先小亏,后而才是大赚!
  13. PHP中Linux知识,超全面的Linux基础知识整理
  14. phy 驱动与 switch 驱动
  15. 基于QT的人脸识别考勤管理系统【一】
  16. Jordan标准形(番外篇)——线性变换可对角化和最小多项式的关系
  17. Win7 任务栏上程序名称修改问题
  18. 山西大同大学技术会,大同大学的家!
  19. #3 GPA计算(python)
  20. java获取微信用户源码_Java微信公众平台开发(十)--微信用户信息的获取

热门文章

  1. P4450-双亲数,P5221-Product,P6055-[RC-02]GCD【莫比乌斯反演,杜教筛】
  2. P4351-[CERC2015]Frightful Formula【组合数学,MTT】
  3. nssl1248-B【点分治,平衡树】
  4. 【双指针】Square Pasture G(P7153)
  5. 动态规划训练16 [Doing Homework HDU - 1074 ]
  6. 北方大学 ACM 多校训练赛 第十五场 买花
  7. 读上瘾-让用户养成习惯
  8. JavaScript学习总结(八)——JavaScript数组
  9. 介绍Java中的内存泄漏
  10. (十三)RabbitMQ使用详解