Fail Fast从字面上看是“快速失败”的意思,或者叫做“速错”,其含义就是让可能发生的错误尽早的被发现。 无论是人类,还是代码这个道理都是适用的。我们在做事的时候,犯错误是很常见的,但是我们应该尽量使得错误发生之初就被发现,并找出原因进行纠正。一开始不重视或者变相的处理了,这会使得错误延后,反而使得损失增大。 还有个事例就是创业,我们就要抱着“如果要失败那就快点”的心态,加快自己前进的步伐。 哈哈,说远了,今天主要说的是程序设计中的Fail Fast。
在我们软件开发的过程中,当碰到问题了,我们第一步就是重现问题,然后进行debug,找出问题的原因,但往往有些bug隐藏的比较深,经过n次特定的操作的在特定的环境下才会重现,或者出错后,报错的stack traces的没有指出错误的真正起点。
所以我们设计一个Fail Fast的系统显得很重要了。
很多人设计的系统,为了增强系统的健壮性,自动的将系统中出现的问题处理掉,并继续运行,但是在未来的某个时间引发奇怪的错误。
而fail fast的系统的做法却是相反的,当有问题发生,立即出错,并将出错信息显示出来。这样bug就很容易被发现,而不会进入到最终的产品中。
比如下面的代码片段,假设maxConnections从一个配置文件中读取最大连接数这个数值, 当发现读取到的值为null的时候,我们一般有两种做法,直接返回null或者返回一个默认值。
(在JDK的HashMap的实现中也遵循fail fast原则,当获取遍历游标iterator之后,如果别的线程对map进行修改等操作会抛出异常的,因为这样会使得算法执行的环境发送变化,导致遍历过程中可能发生错误。)
public int maxConnections() {
string property =getProperty("maxConnections");
if (property == null) {
return 10;
} else {
return property.toInt();
}
}
但是这在fail fast的原则下则应该如下
public int maxConnections() {
string property =getProperty("maxConnections");
if (property == null) {
throw new
NullReferenceException (
"maxConnections property not found in"
+ this.configFilePath);
} else {
return property.toInt();
}
}
假设上面的代码是某个web应用的一部分,当某次升级的时候,不小心将maxConnections写错了,或者不小心删除了,那么如果采取默认值 的情况的话,可能程序不会报错,但是运行之后可能会发现因为连接数变小了而使得应用很慢,且这个错误不便于查找,但是如果直接抛异常的话,错误就显而易见 了。
在很多时候,在系统中我们需要建立自己的错误异常处理体系,比如编写一系列的assert检测方法,并定义自己的异常类型,在正确的地方抛出异常。
fail fast的方式可能使你感觉到软件的健壮性不是很好,的确它让我们更容易的找到错误,那么当我们最终将软件部署成产品的时候,还需要这样的写法么,很多时 候我们在发布的时候都回将assert关闭,为了避免因为错误使得程序crash掉,但是真的有必要这么做么,其实没有必要,有时候线上的错误很少会发 生,如果发生了错误,而不直接显示,那么我们开发人员找错误的时候,首先就需要重现问题,而这个可能很难重现出来。当然我们可以使得异常的方式处理的友好 些。比如跳出一些错误异常窗口,然后询问是否将异常发生时的状态和错误信息发送给开发人员。 这样将有助于软件bug的修复。
相关推荐
Java Collections中的Fail Fast机制
可以通过 Environment.FailFast 里面添加字符串告诉用户当前的进程无法继续运行在 dotnet 中有 Environment.FailFast
tcp-failfast tcp-failfast是一个Go库,它可以控制TCP“用户超时”行为。 :stopwatch: 此超时在指定,但并非在所有平台上都实现。 目前支持Linux和Darwin。
目录常见方案的配置示例并行运行的配置TypeScript的用法 安装将插件添加到devDependenciesnpm i --save-dev cypress-fail-fast 在cypress/plugins/index.js内部: module . exports = ( on , config ) => { require ...
下面小编就为大家带来一篇老生常谈java中的fail-fast机制。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
最小测试:: FailFast 重新实现RSpec的故障快速功能,因为存在测试失败,该功能将退出运行测试套件。 安装 将此行添加到您的应用程序的Gemfile中: gem 'minitest-fail-fast' 然后执行: $ bundle 或将其自己...
fail-fast俗称快速失败,是在多线程进行迭代操作时产生冲突的一种异常抛出机制,下面我们就由ArrayList来深入理解Java中的fail-fast机制.
Java实现dubbo集群容错
jmeter测试使用过程中常见插件,来满足扩展使用效果,实现更多的功能满足需要。 希望可以帮助大家。谢谢
Fail-Fast机制 由于HashMap(ArrayList)并不是线程安全的,因此如果在使用迭代器的过程中有其他线程修改了map(这里的修改是指结构上的修改
Java Collections中的Fail Fast机制.pdf Java 推荐读物.pdf Java 推荐读物与源代码阅读.pdf JDBC-ODBC使用Excel作数据源.pdf JDBC中操作Blob、Clob等对象.pdf JDBC中驱动加载的过程分析(上).pdf JDBC中驱动加载的...
Dubbo 3 Dubbo是什么? 3 为什么要用Dubbo? 3 Dubbo架构 4 节点角色说明 4 调用关系说明 4 连通性 4 健状性 5 伸缩性 5 升级性 5 节点角色说明 5 Dubbo 和spring cloud区别 6 ...Failfast Cluster 13 等分布式微服
fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所...
【面试普通人VS高手系列】Fail-safe机制与Fail-fast机制分别有什么作用.doc
前端开源库-hydro-fail-fast液压快速失效,第一次失效时中止液压试验
文章目录简介Fail-fast IteratorFail-fast 的原理Fail-safe Iterator总结 fail-safe fail-fast知多少 简介 我们在使用集合类的时候,通常会需要去遍历集合中的元素,并在遍历中对其中的元素进行处理。这时候我们就要...
Java Collections中的Fail Fast机制.pdf Java 推荐读物.pdf Java 推荐读物与源代码阅读.pdf JDBC-ODBC使用Excel作数据源.pdf JDBC中操作Blob、Clob等对象.pdf JDBC中驱动加载的过程分析(上).pdf JDBC中驱动加载的...
Iterator与fast-fail机制
Addi onally, we are seeing bold new concepts such as “collabora on,” “failing is okay, just fail fast,” “over communicate with feedback,” take over the IT organiza on in the hot methodology ...