Erlang(或Joe Armstrong的?)建议 不使用防御性编程 而且,让流程崩溃(而不是用不必要的警卫污染您的代码,试图跟踪残骸)对我来说是如此重要,以至于我想知道为什么我浪费了这么多努力来处理多年来的错误处理!

我想知道的是 - 这种方法仅适用于像Erlang这样的平台吗? Erlang具有一个简单的本机支持过程监督树的VM,重新启动过程是 真的 快速地。我是否应该将开发工作(不在Erlang世界中)花在重新创建监督树上,而不是让自己陷入顶级异常处理程序,错误代码,无效结果等。等等。

您认为这种方法的变化在.NET或Java空间中可以很好地工作吗?

有帮助吗?

解决方案

到处适用. 。无论您是否以“让它崩溃”模式编写软件,无论如何,当硬件失败时,它都会崩溃。 “让它崩溃”适用于您需要承受现实的任何地方。詹姆斯·汉密尔顿(James Hamilton):

如果硬件故障需要立即采取行动,则该服务根本不会具有成本效益,可靠地扩展。整个服务必须能够在没有人类行政互动的情况下生存失败。故障恢复必须是一条非常简单的路径,必须经常测试该路径。斯坦福大学的阿曼多·福克斯(Armando Fox)认为,测试失败路径的最佳方法永远不要正常关闭服务。只是用力地剥离它。这听起来是违反直觉的,但是如果不经常使用故障路径,则它们在需要时无法正常工作。

不过,这并不意味着“永远不要使用警卫”。但是不要害怕崩溃!

其他提示

是的,它在任何地方都适用,但是要注意在哪种上下文中要使用它。确实如此 不是 意味着,正如@Peterm所指出的那样,整个应用程序在许多情况下可能会造成灾难性的崩溃。目的是构建一个整体上永远不会崩溃但可以在内部处理错误的系统。在我们的案例中,正是电信系统预计将以每年几分钟的顺序下降。

基本设计是将系统的中央部分分层,以监视和控制完成工作的其他部分。在OTP术语中,我们有 导师工人 过程。主管的工作能够监视工人和其他主管,目的是在工人完成所有实际工作时以正确的方式重新启动他们。使用这种严格分离功能的原理在层中正确构建系统,使您可以将大部分错误从工人中隔离到主管中。您试图最终得到一个 小的 故障安全错误内核,如果正确,可以处理系统其余部分中的任何地方。正是在这种情况下,要使用“折磨”哲学。

您会在任何地方都在考虑错误和失败的位置,目的是在尽可能少的地方实际处理它们。

处理错误的最佳方法当然取决于错误和系统。有时,最好尝试在一个过程中在本地捕获错误并尝试在此处处理错误,如果这种错误不起作用,则可以再次失败。如果您有许多合作的工作流程,那么通常最好将它们全部崩溃并重新启动。这是这样做的主管。

您确实需要一种语言,该语言在出现问题时会生成错误/异常,因此您可以将它们捕获或使它们崩溃。只是忽略错误返回值不是同一回事。

它称为失败狂。这是一个很好的范式,只要您有一个可以应对失败的人团队(并迅速做到)。

在海军中,所有管道和电气都安装在墙壁的外部(最好在墙壁的更公共侧)。这样,如果存在泄漏或问题,则更有可能快速检测到。在海军中,人们因不对失败做出反应而受到惩罚,因此效果很好:迅速检测到失败并迅速采取行动。

在某人无法迅速采取失败行动的情况下,这是一个意见问题,即允许失败阻止系统或吞噬失败并尝试继续前进是否更有益。

我编写了依靠现实世界中数据的程序,如果它们崩溃,它们可能会造成大$$的身体损害(更不用说损失的收入中的大$$)。如果我没有防御性编程,我将退出闪光灯。

话虽如此,我认为Erlang必须是一个特殊情况,您不仅可以立即重新启动事情,还可以重新启动程序弹出,环顾四周,说“啊..那是我在做的!”

我的同事和我本人对这个话题的思考不是特别明智,而是从领域的角度和安全重点来看。

问题是“让它崩溃安全吗?”或者更好的是“甚至可以将鲁棒性范式应用于Erlang的“ Let It崩溃”(与安全相关的软件项目)?”。

为了找到一个答案,我们使用具有工业,尤其是医学背景的近实现场景进行了一个小型研究项目。在这里看看http://bit.ly/z-blog_let-it-crash)。甚至还有一篇论文可以下载。告诉我你的想法!

我个人认为,它适用于许多情况,甚至是理想的,尤其是在有很多错误处理要做的情况下(与安全有关的系统)。您不能总是使用erlang(缺少实时功能,没有真正的嵌入式支持,castumer whres ...),但是我很确定您可以否则可以实现它(例如使用线程,异常,消息传递)。我还没有尝试过,但是我想。

恕我直言,有些开发人员用代码来处理/包装检查异常,这些代码几乎没有值。除非您要处理并添加一些值,否则允许使用原始异常的方法通常会更简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top