Syntax 在Elixir中省略'try'的正确语法

Syntax 在Elixir中省略'try'的正确语法,syntax,elixir,Syntax,Elixir,我目前正在使用长生不老药官方指南学习长生不老药。我正在研究错误处理部分,遇到了某些部分 有时,您可能希望在一次尝试中包装函数的整个主体 构造,通常是为了保证某些代码在以后执行。 在这种情况下,Elixir允许您省略try行: 我很好奇,如果我不省略try语法,正确的语法是什么。到目前为止,我最好的猜测如下,但这似乎不是一个正确的方法 iex> defmodule RunAfter do ...> try do ...> def without_even_tryin

我目前正在使用长生不老药官方指南学习长生不老药。我正在研究错误处理部分,遇到了某些部分

有时,您可能希望在一次尝试中包装函数的整个主体 构造,通常是为了保证某些代码在以后执行。 在这种情况下,Elixir允许您省略try行:

我很好奇,如果我不省略
try
语法,正确的语法是什么。到目前为止,我最好的猜测如下,但这似乎不是一个正确的方法

iex> defmodule RunAfter do
...>   try do 
...>     def without_even_trying do
...>       raise "oops"
...>     end
...>   after
...>      IO.puts "cleaning up!"
...>   end
...> end

试试看。。。之后末端应位于def内:

iex(1)> defmodule RunAfter do
...(1)>   def without_even_trying do
...(1)>     try do
...(1)>       raise "oops"
...(1)>     after
...(1)>       IO.puts "cleaning up!"
...(1)>     end
...(1)>   end
...(1)> end
iex(2)> RunAfter.without_even_trying
cleaning up!
** (RuntimeError) oops
    iex:4: RunAfter.without_even_trying/0
您的第二个代码也是有效的,但它将截获在编译时定义方法时抛出的错误:

iex(1)> defmodule RunAfter do
...(1)>   try do
...(1)>     def without_even_trying do
...(1)>       raise "oops"
...(1)>     end
...(1)>     raise "at compile time"
...(1)>   after
...(1)>      IO.puts "cleaning up!"
...(1)>   end
...(1)> end
cleaning up!
** (RuntimeError) at compile time
    iex:6: (module)
iex(1)> RunAfter.without_even_trying
** (UndefinedFunctionError) function RunAfter.without_even_trying/0 is undefined (module RunAfter is not available)
    RunAfter.without_even_trying()

试试看。。。之后末端应位于def内:

iex(1)> defmodule RunAfter do
...(1)>   def without_even_trying do
...(1)>     try do
...(1)>       raise "oops"
...(1)>     after
...(1)>       IO.puts "cleaning up!"
...(1)>     end
...(1)>   end
...(1)> end
iex(2)> RunAfter.without_even_trying
cleaning up!
** (RuntimeError) oops
    iex:4: RunAfter.without_even_trying/0
您的第二个代码也是有效的,但它将截获在编译时定义方法时抛出的错误:

iex(1)> defmodule RunAfter do
...(1)>   try do
...(1)>     def without_even_trying do
...(1)>       raise "oops"
...(1)>     end
...(1)>     raise "at compile time"
...(1)>   after
...(1)>      IO.puts "cleaning up!"
...(1)>   end
...(1)> end
cleaning up!
** (RuntimeError) at compile time
    iex:6: (module)
iex(1)> RunAfter.without_even_trying
** (UndefinedFunctionError) function RunAfter.without_even_trying/0 is undefined (module RunAfter is not available)
    RunAfter.without_even_trying()

我认为您在描述中缺少的部分,特别是“您可能希望包装函数的整个主体”。您正在包装声明:)我认为您在描述中缺少的部分,特别是“您可能希望包装函数的整个主体”。您正在包装声明:)