Erlang(或者Joe Armstrong的?)建议 不使用防御性编程 并让进程崩溃(而不是用不必要的守卫试图跟踪代码来污染你的代码残骸)对我来说非常有意义,我想知道为什么我多年来在错误处理方面浪费了这么多精力!
我想知道的是 - 这种方法仅适用于像Erlang这样的平台吗? Erlang有一个VM,它具有对进程监督树的简单本机支持,并且重启进程真的快。我是否应该花费我的开发工作(当不在Erlang世界中)重新创建监督树而不是用顶级异常处理程序,错误代码,空结果等等来掩盖自己。
您是否认为这种方法的改变在(例如).NET或Java空间中运行良好?
答案 0 :(得分:30)
It's applicable everywhere。无论您是否以“让它崩溃”模式编写软件,它都会崩溃,例如,当硬件出现故障时。 “让它崩溃”适用于您需要承受现实的任何地方。 Quoth James Hamilton:
如果硬件故障需要立即执行管理操作,则该服务无法经济高效且可靠地进行扩展。整个服务必须能够在没有人工管理交互的情况下幸免于难。故障恢复必须是一个非常简单的路径,并且必须经常测试该路径。斯坦福大学的Armando Fox认为,测试故障路径的最佳方法是永远不要正常关闭服务。只是努力失败。这听起来有点违反直觉,但如果不经常使用故障路径,则在需要时它们将无法工作。
但这并不意味着“永远不会使用警卫”。但不要害怕崩溃!
答案 1 :(得分:24)
是的,它适用于所有地方,但重要的是要注意在哪种情况下使用它。 不意味着整个应用程序崩溃,正如@PeterM指出的那样,在很多情况下都可能是灾难性的。目标是建立一个整体从不崩溃但可以在内部处理错误的系统。在我们的案例中,电信系统预计每年的停机时间为几分钟。
基本设计是将系统分层并隔离系统的中心部分,以监视和控制执行工作的其他部分。在OTP术语中,我们有主管和 worker 进程。监督员负责监督工人和其他监督员,目的是在工人完成所有实际工作时以正确的方式重新启动工人。使用严格分离功能的原则在层中正确地构建系统允许您将大部分错误处理从工作者中隔离到监督者中。您尝试最终得到小型故障安全错误内核,如果正确可以处理系统其余部分中的任何错误。正是在这种情况下,才会使用“让它崩溃”的理念。
你会在各处思考错误和失败的悖论,目的是在尽可能少的地方实际处理它们。
处理错误的最佳方法当然取决于错误和系统。有时最好尝试在进程内本地捕获错误并尝试在那里处理错误,如果不起作用,可以选择再次失败。如果您有许多工作进程协作,那么通常最好将它们全部崩溃并重新启动它们。这是一个执行此事的主管。
您确实需要一种语言,当出现问题时会生成错误/异常,因此您可以捕获它们或让它们崩溃。只是忽略错误返回值并不是一回事。
答案 2 :(得分:6)
我编写的程序依赖于来自现实世界的数据,如果它们崩溃,它们可能会造成巨大的物理损失(更不用说收入损失的大美元)。如果我不采取防御计划,我就会失业。
据说我认为Erlang必须是一个特殊情况,不仅可以立即重启,重启的程序可以弹出,环顾四周并说“啊......这就是我在做的事情!”
答案 3 :(得分:5)
它被称为失败快速。这是一个很好的范例,前提是你有一个能够应对失败的团队(并快速做到这一点)。
在NAVY中,所有管道和电气都安装在墙壁的外部(最好是在墙壁的公共侧面)。这样,如果存在泄漏或问题,则更有可能快速检测到。在NAVY中,人们因没有对失败作出反应而受到惩罚,因此效果非常好:快速检测到失败并迅速采取行动。
在某人无法快速对失败采取行动的情况下,如果允许失败停止系统或吞下失败并尝试继续前进,则会更为有利。
答案 4 :(得分:4)
我的同事和我自己都认为这个话题不是特别技术明智,而是从域名角度和安全角度来看。
问题是“让它崩溃是否安全?”或者更好“是否有可能应用像Erlang这样的稳健范例”让它崩溃“到安全相关的软件项目?”。
为了找到答案,我们使用了接近现实的小型研究项目 具有工业和特别是医学背景的情景。看看这里(http://bit.ly/Z-Blog_let-it-crash)。甚至还有一篇论文 下载告诉我你的想法!
就我个人而言,我认为它在很多情况下都适用,甚至是可取的,特别是在需要进行大量错误处理时(安全相关系统)。你不能永远 使用Erlang(缺少实时功能,没有真正的嵌入式支持,客户端发送...),但我很确定你可以实现它(例如使用线程, 例外,消息传递)。我还没试过,但我想。
答案 5 :(得分:2)
恕我直言一些开发人员用代码添加很少的价值来处理/包装已检查的异常。允许方法抛出原始异常通常更简单,除非您要处理它并添加一些值。
答案 6 :(得分:1)
是的,即使在经济上也请参阅这篇文章:https://www.nytimes.com/2020/04/16/upshot/world-economy-restructuring-coronavirus.html。世界已成为“意大利面条法典”,并正在遭受“全球国家”问题。