6

我已经读过关于像 Erlang 这样的语言中快速失败的编程风格如何最终得到比大多数其他语言中的防御风格更短的程序。这对所有类型的程序都正确吗?原因是什么?

4

3 回答 3

10

Fail-fast 程序不一定比防御式程序短:它取决于实现和确保防御性代码安全所需的措施。

在 Erlang 的情况下,fail-fast 程序通常更短,因为声明式风格以及 VM 如何确保为您生成错误案例。例如,在函数中:

day(1) -> sunday;
day(2) -> monday;
day(3) -> tuesday;
day(4) -> wednesday;
day(5) -> thursday;
day(6) -> friday;
day(7) -> saturday;

传递给函数的任何意外值都将导致错误,该错误可由另一个进程(即:主管)捕获和处理。此类错误也永远不会危及整个系统,并且不需要将代码添加到函数本身——这一切都是通过预定行为在正常执行路径之外完成的。

在快速失败不是常态的动态语言中,您必须手动检查边界并自己抛出异常。然后,如果您不希望整个系统停机,则必须在本地捕获异常(包括顶级尝试...捕获)。错误处理代码通常必须插入到整个正常执行路径中。

在快速失败不是常态的静态语言中,您的代码将在很大程度上取决于您拥有的类型系统。如果语言允许定义编译器最终为您检查边缘情况的类型,那么您通常不必在代码内部、非确定性事件(文件不工作、意外用户输入等)之外处理这个问题。具有这种类型系统的语言,会在运行时之前捕获许多错误,因此您不会有那么多防御性案例。

当错误处理无法避免时,支持快速失败习语的语言(如 Erlang)将允许比不支持(静态或非静态)的语言更清晰的代码,主要是因为特殊情况的代码不会与理想执行路径的代码。

于 2010-06-23T14:58:46.803 回答
5

请参阅 Joe Armstrong论文的第 4.3 和 4.4 节。

于 2010-06-22T14:51:22.210 回答
-4

The fail-fast style of programming is focused on better code readability and debugging. The user experience is a secondary target: a user may experience strange error messages or program failures, but the greater quality of code allows programmers to easily find the bug and correct the issue.

Defensive style programming, instead, focuses on validation input from user and from other portions of code. The code is more verbose, because the programmer has to carefully verify input and fail gracefully in case of error. This lead to more code (from the programmers' point of view) and a more robust application (from the users' point of view).

于 2010-06-22T12:58:04.390 回答