發生這種情況是因爲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來做到這一點。在一個過程中分配資源。 –