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机制详解 #### 一、概述 在Java编程中,**Fail Fast**机制是一项重要的设计原则,特别是在处理集合时尤为关键。它主要用于确保数据结构的一致性和完整性,通过快速检测并报告...
可以通过 Environment.FailFast 里面添加字符串告诉用户当前的进程无法继续运行在 dotnet 中有 Environment.FailFast
Dubbo提供了一套完整的容错机制,包括Failover(失败自动切换)、Failfast(快速失败)、Failsafe(失败安全)、Fallback(失败回调)、Retry(重试)等策略。 1. Failover:这是默认的容错策略,当调用失败时,会...
tcp-failfast tcp-failfast是一个Go库,它可以控制TCP“用户超时”行为。 :stopwatch: 此超时在指定,但并非在所有平台上都实现。 目前支持Linux和Darwin。
Java中的Fail-Fast机制详解 Java中的Fail-Fast机制是一种错误检测机制,当多个线程对集合进行结构上的改变操作时,有可能会产生Fail-Fast机制。这种机制是Java集合框架的一部分,可以帮助检测并发修改引发的错误。 ...
目录常见方案的配置示例并行运行的配置TypeScript的用法 安装将插件添加到devDependenciesnpm i --save-dev cypress-fail-fast 在cypress/plugins/index.js内部: module . exports = ( on , config ) => { require ...
文档中提到了实现设计的步骤,包括逻辑优化、放置(placement)、布线(routing)等,以及使用report_failfast命令清除报告,并运行report_timing_summary来检查时序是否已经满足WNS(worst negative slack)大于0...
本文将详细介绍其中的"FailFast"和"FailOver"策略,并提供相关的代码实现。 1. **FailFast(快速失败)策略** FailFast策略是最简单的处理方式,当调用服务首次失败时,它立即抛出异常,不进行任何重试。这种策略...
Fail-safe机制与Fail-fast机制的比较分析 在多线程并发操作中,Fail-safe机制和Fail-fast机制是两种常见的失败处理机制,它们的作用和实现原理有所不同。 Fail-fast机制是一种快速失败机制,在集合遍历过程中,...
最小测试:: FailFast 重新实现RSpec的故障快速功能,因为存在测试失败,该功能将退出运行测试套件。 安装 将此行添加到您的应用程序的Gemfile中: gem 'minitest-fail-fast' 然后执行: $ bundle 或将其自己...
整个流程从开放综合后的设计检查点(DCP)或后优化设计DCP(如果可用)开始,接着是详细的初始设计检查,通过Failfast报告识别设计特性或约束上的问题。如果报告中有不清洁的项,则需要进行修正,直到报告清洁为止。...
4. FailFast报告:基于Tcl的FailFast报告汇总了关于设计和约束的关键信息,允许用户快速识别和解决常见的实现和性能问题。此报告默认分析整个设计,并输出一个表格,其中每个分析的度量标准与典型指导标准进行比较。...
可以通过`xilinx::designutils::report_failfast`和`report_qor_assessment`命令来运行这些报告。 **Vitis环境中的报告** 在Vitis环境中,`report_failfast`在使用`v++ -R 1`或`v++ -R 2`时会自动调用。为了生成QoR...
Fail-Fast机制是一种Java集合框架中的设计策略,主要用于在多线程环境下确保程序的正确性和稳定性。当一个线程在遍历集合时,如果另一个线程对集合进行了结构上的修改,Fail-Fast机制会立即抛出`...
【前端开源库-hydro-fail-fast】是一个专为前端开发者设计的开源库,其核心功能是在测试过程中实现“液压快速失效”机制。这个概念源于工程领域,尤其在液压试验中,当系统首次检测到异常或故障时,为了保护设备和...
Java fail-fast 机制详解 Java fail-fast 机制是一种系统设计理念,旨在快速检测和报告可能的故障情况,以便尽早采取措施避免更大的错误。这种机制的主要思想是,在系统设计时考虑到异常情况,并在检测到错误时...
JMeter是一款广泛应用于性能测试领域的开源工具,尤其在Web应用测试方面表现卓越。"jmeter测试插件-20190123.zip"这个压缩包文件包含了JMeter的一系列插件,这些插件旨在扩展JMeter的功能,以满足更复杂的测试需求。...