我想更好地了解什么是快速故障和故障安全。
乍一看,fail-fast 意味着我们希望在发生任何意外事件时使系统明显失败。
我的意思是举个例子,如果工厂不能创建对象的实例,为了快速失败的原则,我们真的不希望工厂返回 null、空对象或部分初始化的对象,这些对象可能会被偶然使用应用程序正确 -> 大多数时候我们会遇到意外行为,或者在另一个级别引发意外异常,这不允许我们知道真正的问题在工厂中。
这个原理是什么意思?
故障安全原则对我来说很难理解。
Java 中最常见的例子是关于集合、它们的迭代器和并发访问。
据说允许在迭代列表时修改列表的集合/迭代器称为故障安全。它通常通过最终迭代初始列表的副本来完成。
但是在这个例子中,我真的不明白系统在哪里出现故障......因此虽然它是故障安全的......故障在哪里?我们只是迭代或不迭代,这取决于我们的需要......
我没有看到任何与故障安全的维基定义相匹配的......
因此,在这样的文章中:
http://www.certpal.com/blogs/2009/09/iterators-fail-fast-vs-fail-safe/
他们将快速故障与故障安全相对立......我只是没有理解为什么我们在副本上称此迭代为故障安全......
我在这里找到了另一个例子:
http://tutorials.jenkov.com/java-exception-handling/fail-safe-exception-handling.html
它似乎与故障安全原则的初始定义更相关。
我对故障安全的看法是,当系统发生故障时,我们必须确保故障处理程序不会发生故障,或者,如果发生故障,请确保处理程序的故障不会隐藏真正的初始问题。在给定的示例中,处理程序就在初始故障代码附近,但情况并非总是如此。故障安全对我来说意味着更多的东西,比如我们正确处理故障处理程序中可能发生的错误或类似的东西......
因此对我来说,这两个原则似乎并不矛盾。
你怎么认为?
系统不能快速安全地失败吗???
最佳答案
最好首先避免失败(故障安全),但如果这不可能,最好快速失败(尽快失败)。
两者不是对立的,而是相辅相成的。
正如你所说 - 我喜欢我的代码尽可能安全,但如果不是,我希望它快速失败。
关于language-agnostic - 快速故障和故障安全异常处理原则是否不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4345250/