将Erlang catch转换为Elixir

时间:2016-03-15 07:08:42

标签: erlang elixir

在Erlang中,我可以做类似

的事情
[catch X+1 || X <- [4,a,6], X > 3].

获取结果,

[5, {‘EXIT’, _}, 7]

有人能告诉我怎样才能在Elixir中找到类似的东西吗? 我在Elixir中找不到catch

更新

经过一番尝试后,我想我找到了答案。

iex(3)> a = for i <- [4, :a, 6] do
...(3)>   try do
...(3)>     i+1
...(3)>   catch
...(3)>     error, reason ->
...(3)>       {error, reason}
...(3)>   end
...(3)> end
[5, {:error, :badarith}, 7]

1 个答案:

答案 0 :(得分:3)

Expression catchtry表达式的旧版本。它总是返回一些内容并捕获所有异常,将它们转换为文档中所述的术语:

  

对于类错误的例外,即运行时错误,返回{&#39; EXIT&#39;,{Reason,Stack}}。   对于类exit的例外,即返回名为exit(Term),{&#39; EXIT&#39;,Term}的代码。   对于类throw的异常,即名为throw(Term)的代码,返回Term。

它是语言的构造,它的语法,因此需要在Elixir中实现(即具有与Erlang中相同的语义)。从文档中可以看出,Elixir仅支持try semantic。您提出的解决方案是一个很好的解决方法。