因此,在Elixir文档的这一页中,我和一些朋友围绕着一段话进行了对话.
在Elixir中,可以抛出一个值,然后被捕获.throw和catch保留用于无法检索值的情况,除非使用throw和catch.
除非与未提供适当API的库接口,否则这些情况在实践中非常罕见.
哪些情况需要使用try/throw/catchvs. try/rescue?这是为了与一些现有的Erlang库连接吗?页面上的示例显示了Elixir代码,这是我觉得有点混乱.
什么是我应该寻找的"适当的API"?我的意思是这是一个协议吗?
mic*_*ala 12
我认为raise/rescue是明确关于异常处理的 - 意思是完全意外的情况,你想要有一个堆栈跟踪和一个程序员看它.它可能由于多种因素而发生 - 程序员错误,错误的环境等,但是提供无效数据的用户不是这些情况之一.
抛出/捕获在您预期失败的地方很有用,但您仍然希望使用raise/rescue提供的非本地控制流.这也允许您跳过构建有时相当大的堆栈跟踪的成本.经典的例子是:
我选择一个在另一个上面的经验法则是,捕获对于正常运行的程序是必不可少的,而在一般情况下救援应该是可移除的.当然,该规则也有例外,但我认为这是一个有用的第一级区别.