在Elixir中哪些情况需要投掷/捕获?

时间:2016-03-16 13:01:53

标签: elixir

因此,在这篇page Elixir文档中,我和一些朋友围绕着一段话进行了对话。

  

在Elixir中,可以抛出一个值,然后被捕获。投掷和捕获   保留用于无法检索的情况   值,除非使用throw和catch。

     

这些情况在实践中非常罕见,除非   与没有提供适当API的库连接。

使用try/throw/catchtry/rescue需要哪些情况?这是为了与一些现有的Erlang库连接吗?页面上的示例显示了Elixir代码,这是我觉得有点混乱。

我应该寻找的“适当的API”是什么?我的意思是这会是一个协议吗?

1 个答案:

答案 0 :(得分:11)

我认为raise / rescue是明确关于异常处理的 - 意思是完全意外的情况,你想要一个堆栈跟踪和一个程序员看它。它可能由于多种因素而发生 - 程序员错误,错误的环境等,但是提供无效数据的用户不是这些情况之一。

Throw / catch在您预期失败的地方非常有用,但您仍然希望使用raise / rescue提供的非本地控制流。这也允许您跳过构建有时相当大的堆栈跟踪的成本。经典的例子是:

我选择一种方法的经验法则是,捕获对于正常运行的程序至关重要,而救援在一般情况下应该是可移除的。当然,该规则也有例外,但我认为这是一个有用的第一级区别。