Language agnostic 故障快速和故障安全异常处理原则是否不兼容?

Language agnostic 故障快速和故障安全异常处理原则是否不兼容?,language-agnostic,exception,exception-handling,Language Agnostic,Exception,Exception Handling,我想更好地理解什么是故障快速和故障安全 乍一看,fail fast(快速失效)意味着我们希望在发生任何意外事件时,让系统明显失效。 我的意思是,例如,如果工厂不能创建对象的实例,根据fail-fast原则,我们真的不希望工厂返回null、空对象或部分初始化的对象,这些对象可能会被应用程序正确使用->大多数时候我们会有意外的行为,或者在另一个层面出现意外的异常,不允许我们知道真正的问题在工厂里。 这就是这个原则的含义吗 故障安全原则对我来说很难理解。 Java中最常见的例子是关于集合、它们的迭代器

我想更好地理解什么是故障快速和故障安全

乍一看,fail fast(快速失效)意味着我们希望在发生任何意外事件时,让系统明显失效。 我的意思是,例如,如果工厂不能创建对象的实例,根据fail-fast原则,我们真的不希望工厂返回null、空对象或部分初始化的对象,这些对象可能会被应用程序正确使用->大多数时候我们会有意外的行为,或者在另一个层面出现意外的异常,不允许我们知道真正的问题在工厂里。 这就是这个原则的含义吗

故障安全原则对我来说很难理解。 Java中最常见的例子是关于集合、它们的迭代器和并发访问。 据说,允许在遍历列表时修改列表的集合/迭代器称为fail-safe。通常通过最后迭代初始列表的副本来完成。 但在这个例子中,我真的不明白系统在哪里失败。。。因此,虽然它是故障安全的。。。失败在哪里?我们只是在副本上迭代或不迭代,这取决于我们的需要。。。 我看不到任何与维基对故障保护的定义相匹配的东西

因此,在以下条款中: 从快速故障到安全故障。。。我不明白的是,为什么我们称这个副本上的迭代为故障保护

我在这里找到了另一个例子: 这似乎和故障安全原则的初始定义有很大关系。 我对故障安全的看法是,当系统发生故障时,我们必须确保故障处理程序不会出现故障,或者,如果出现故障,则必须确保真正的初始问题不会被处理程序的故障所掩盖。在给定的示例中,处理程序就在初始故障代码附近,但情况并非总是如此。对我来说,故障安全意味着我们可以正确处理故障处理程序中可能发生的错误或类似的事情

因此,对我来说,这两个原则似乎并不矛盾。 你怎么认为?
系统不能快速安全地发生故障吗?

最好首先避免故障(故障安全),但如果这不可能,最好快速发生故障(尽可能快地发生故障)

两者不是对立的,而是互补的

正如你所说的-我希望我的代码尽可能地具有故障安全性,但如果没有,我希望它快速失效。

故障安全并不意味着某些东西不会失效——它意味着当它失效时,它会以安全的方式失效。不能失败的东西是可以证明失败的——这是完全可能的

如果电缆断裂,故障安全电梯在其当前位置堵塞。骑手们很不方便地被卡住了,但也很方便地没有死

考虑迭代器的例子。其理论是,最好立即向客户机代码发出信号,说明有什么问题,而不是盲目地返回一个看起来有效的答案,这可能会导致更严重的问题。如果客户端代码具有安全意识,它就有机会立即进行干预和恢复。因此,在这种情况下,故障安全和故障快速是兼容的,后者是实现前者的一种策略

另一方面,考虑一个网页浏览器的人谁不舒服的电脑。他们想看看他们的电影什么时候开始。假设页面上的HTML格式不正确(但愿如此)。如果呈现程序快速失败,它可能会决定放弃呈现用户希望看到的信息,因为前面的

标记拼写为
。在这种情况下,最好是继续犯错,尽可能最好地呈现页面。这个错误可能是无关紧要的,从来没有被发现,也可能是被发现得太多,太晚了,因为有人最终发现页面看起来不太正确。所以这里有一个例子,fail fast不是一个很好的故障安全策略

如果该网页是我的网上银行应用程序,我肯定希望它在出现最轻微的问题时轰然爆炸(当然是回滚)。因此,fail fast再次成为故障安全的首选策略

我的观点是,故障安全本身就是一个概念,快速故障可能是也可能不是导致故障安全的一种特殊技术