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

标签 language-agnostic exception exception-handling

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

乍一看,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/

相关文章:

image-processing - 将 RGB 转换为灰度/强度

python-3.x - ConnectionResetError 异常 : [Errno 54] Connection reset by peer

java - 如何知道抛出了哪个异常

design-patterns - 捕获所有异常并将它们作为特定类型的异常在分类方面重新抛出是一种好的做法吗?

python - 异常处理后如何返回for循环

arrays - 有没有比 O(N) 更好的算法来找到由连续 block 组成的位数组中的第一个位集?

.net - OO 模式 : Shared work between abstract base class and subclasses

algorithm - 谷歌面试算法拼图 : expected size of the largest connected component in a random simple graph (N nodes, N 边)?

java - EJB 3.1 - 处理异步作业中的异常

c# - .net c# 异常处理在 64 位模式下失败