fail fast

原创 2013年12月05日 16:08:54

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中 Fail-fast 和 Fail-safe 的原理与使用

在我们详细讨论这两种机制的区别之前,首先得先了解并发修改。 1.什么是同步修改? 当一个或多个线程正在遍历一个集合Collection,此时另一个线程修改了这个集合的内容(添加,删除或者修改)。这...
  • bigtree_3721
  • bigtree_3721
  • 2017年03月27日 23:40
  • 502

Java提高篇(三四)-----fail-fast机制

在JDK的Collection中我们时常会看到类似于这样的话:        例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性...
  • chenssy
  • chenssy
  • 2014年07月26日 22:40
  • 34534

快速报错(Fail fast)

Java 容器有一种保护机制,能够防止多个进程同时修改同一个容器的内容。如果你正在迭 代遍历某容器,此时另一个进程介入其中,并且插入、删除或修改此容器内的某个对象, 那么就会出现问题:也许迭代过程...
  • u011282129
  • u011282129
  • 2013年08月26日 10:25
  • 512

关于快速报错fail-fast想说的之fail-fast的实现原理(一)

最近在翻译HashMap的源码注释,看到了fail-fast。之前在看第四版《Thinking in java》的第17章容器深入研究 17.11.3中的“快速报错”时就有些迷迷糊糊,今天查了下资料,...
  • fan2012huan
  • fan2012huan
  • 2016年04月07日 10:34
  • 1396

快速失败(fail—fast) 和 安全失败(fail—safe)总结

快速失败:当你在迭代一个集合的时候,如果有另一个线程正在修改你正在访问的那个集合时,就会抛出一个ConcurrentModification异常。     在java.util包下的都是快速失败。 ...
  • u013898617
  • u013898617
  • 2018年01月17日 23:53
  • 6

论文笔记 《Fast R-CNN》

转载自http://zhangliliang.com/2015/05/17/paper-note-fast-rcnn/ 论文出处见:http://arxiv.org/abs/1504.08083 项...
  • u010678153
  • u010678153
  • 2015年07月15日 13:01
  • 41864

FAST-ER角点检测算法详解(改良的FAST算法)

FAST-ER是FAST算法原作者在2010年提出的,它在原来算法里提高特征点检测的重复度,重复意味着第一张图片内的检测的点,也可以在第二张图片上的相应位置被检测出来,重复度可以由如下式子定义: ...
  • tostq
  • tostq
  • 2015年10月22日 16:21
  • 2122

报表——Fast Report

一套软件,应该是离不开报表的,以前一直是接触的是水晶报表、Grid Report报表等,这篇博客说一下Fast Report报表。        1、   初步了解:         ...
  • u013047824
  • u013047824
  • 2016年10月09日 20:43
  • 1523

FAST算法学习

FAST 全称 Features fromaccelerated segment test,一种用于角点检测的算法,该算法的原理是取图像中检测点,以该点为圆心的周围的16个像素点判断检测点是否为角点。...
  • ouyangying123
  • ouyangying123
  • 2017年05月10日 20:26
  • 548

HashMap 多线程处理之 Fail-Fast机制

原文出处:HashMap 多线程处理之 Fail-Fast机制 作者 alex_lo Fail-Fast机制: 我们知道java.util.HashMap不是线程安全的,因此如果在使用迭代器的过程中...
  • fjse51
  • fjse51
  • 2017年03月03日 17:03
  • 476
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fail fast
举报原因:
原因补充:

(最多只允许输入30个字)