erlang - Erlang 中的非防御性编程

标签 erlang

以下几行出现在 http://aosabook.org/en/riak.html 中,在该部分的第二段: 15.1. Erlang 简介 :

"Calling the function with a negative number will result in a run time error, as none of the clauses match. Not handling this case is an example of non-defensive programming, a practice encouraged in Erlang."



两个问题:在Erlang中处理由此产生的错误的惯用方式是什么?为什么这比明确涵盖所有情况更好,如在 OCaml 或 Haskell 之类的语言中?

最佳答案

如果您不为错误情况编写任何代码,让系统生成运行时错误,您至少会获得 3 个优势:

  • 代码更小,更容易阅读,专注于实现的功能。
  • 在错误情况下,系统将引发符合 OTP 标准的错误,您将受益于免费的所有 OTP 机制以在适当级别处理情况。
  • 您会自动避免“烤宽面条”错误检测综合症,其中许多代码层跟踪相同的错误情况。

  • 现在您可以专注于错误管理:您将在哪里处理错误。 Erlang 提供了经典方式 trycatch语句,并具有更惯用的方式与 OTP 监督树和链接和监视机制。

    简而言之,您可以控制一个进程崩溃的后果(哪些进程会随之崩溃,哪些进程将被通知)以及重新启动它们的复杂方法。

    重要的是要记住,在 erlang 中,您通常会启动许多小进程,这些进程的作用和责任非常有限,在这种情况下,让它们崩溃并重新启动确实很有意义。

    我是 learnyousomeerlang 的粉丝您将在其中找到与错误管理相关的 3 章的网站:
  • 错误和异常
  • 错误和过程
  • 谁监督监事?
  • 关于erlang - Erlang 中的非防御性编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32815326/

    相关文章:

    erlang - 如何纠正语法?

    emacs - Emacs 是否有可能像 Elisp 函数一样在回显区域中显示 Erlang 函数 arity?

    java - 从 Java 获取 Ping 到 Erlang

    ubuntu - 使用单个脚本文件启动两个 mochiweb 服务器

    Erlang:如何配置qlc:q是进行全表扫描,键前缀扫描还是键查找?

    erlang - 在Erlang shell中,如何自动读取所有记录定义 header

    asynchronous - Erlang:使用 gen_server:cast/2 和标准消息传递之间的区别

    performance - 从头开始合并列表列表

    string - Erlang 术语到 Unicode 字符串

    binary - 进程间共享大二进制数据