【问题标题】:Which Situations Require Throw/Catch In Elixir?哪些情况需要在 Elixir 中投掷/接球?
【发布时间】:2016-07-02 09:07:36
【问题描述】:

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

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

这些情况在实践中并不常见,除非 与不提供适当 API 的库交互。

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

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

【问题讨论】:

  • Dave Thomas 的书给出了几个例子:数据库出现故障或名称服务器无法响应,或无法打开名称固定的配置文件。
  • 为什么这些情况需要捕获而不是救援?这就是我要问的——那里有什么区别?
  • 我应该进一步研究一下。看起来这个问题不久前在 Elixir 核心列表中被问及并得到了回答:groups.google.com/d/topic/elixir-lang-core/0eG2BqKfC_U/…

标签: elixir


【解决方案1】:

我认为 raise/rescue 明确地涉及异常处理——这意味着完全出乎意料的情况,您希望堆栈跟踪和程序员查看它。这可能是由于多种原因导致的 - 程序员错误、错误的环境等,但用户提供无效数据不是其中一种情况。

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

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

【讨论】:

  • 鉴于您的评论和 Jose 的回答—— raise 是否会生成堆栈跟踪而 throw 不会?这是显着差异之一吗?
猜你喜欢
  • 2017-10-12
  • 2016-05-11
  • 2023-03-16
  • 2011-05-06
  • 1970-01-01
  • 2010-09-23
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多