发生这种情况是因为Elixir无法保证在引发异常时这些变量会被设置。这可能不适合你,但想象一下这样的事情。
try do
foo = do_something_safe()
bar = do_something_that_will_raise_an_error()
baz = do_something_else_safe()
...
rescue
RuntimeError ->
quux(foo, baz)
end
在前面的示例中,调用do_something_that_will_raise_an_error()
会引发错误。因为它,bar
和baz
将不会被设置。
在这种特定的情况下,你可以像做
baz = do_something_else_safe()
foo = do_something_safe()
try do
bar = do_something_that_will_raise_an_error()
...
rescue
RuntimeError ->
quux(foo, baz)
end
现在,即使调用do_something_that_will_raise_an_error()
引发错误,你仍然有foo
,并baz
变量设置,并且可以用于救援区块。
基本上,设置您可以在try
以外的变量。 This给出了一个try ... rescue
内变量作用域的小概述。
考虑到这一点,最好是设置一位主管,并在GenServer
(或者其他任何受监督的流程)中执行此操作。这样,如果它崩溃了,主管可以决定如何处理它。 Elixir和Erlang的想法都是“让它崩溃”,而不是试图在防守方面进行编程。
认真 - - 通过gen_server来做到这一点。在一个过程中分配资源。 –