Erlang 中的非防御性编程
Non-defensive programming in 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 机制,以在适当的级别处理这种情况。
您会自动避免 "lasagna" 错误检测综合症,其中许多代码层跟踪相同的错误情况。
现在您可以专注于错误管理:您将在哪里处理错误。 Erlang 提供了使用 try
和 catch
语句的经典方法,并提供了一种更惯用的 OTP 监督树和 link 和监控机制的方法。
简而言之,您可以控制一个进程崩溃的后果(哪些进程会随之崩溃,哪些进程会收到通知)以及重新启动它们的复杂方法。
重要的是要记住,在 erlang 中,您通常会启动许多作用和责任非常有限的小进程,在这种情况下,让它们崩溃并重新启动确实很有意义。
我是 learnyousomeerlang 网站的粉丝,您可以在该网站找到与错误管理相关的 3 章:
- 错误和异常
- 错误和过程
- 谁监督监督者?
以下行出现在 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 机制,以在适当的级别处理这种情况。
您会自动避免 "lasagna" 错误检测综合症,其中许多代码层跟踪相同的错误情况。
现在您可以专注于错误管理:您将在哪里处理错误。 Erlang 提供了使用 try
和 catch
语句的经典方法,并提供了一种更惯用的 OTP 监督树和 link 和监控机制的方法。
简而言之,您可以控制一个进程崩溃的后果(哪些进程会随之崩溃,哪些进程会收到通知)以及重新启动它们的复杂方法。
重要的是要记住,在 erlang 中,您通常会启动许多作用和责任非常有限的小进程,在这种情况下,让它们崩溃并重新启动确实很有意义。
我是 learnyousomeerlang 网站的粉丝,您可以在该网站找到与错误管理相关的 3 章:
- 错误和异常
- 错误和过程
- 谁监督监督者?