これは、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
の両方が設定されていません。
この特定のケースでは、あなたがdo_something_that_will_raise_an_error()
への呼び出しにエラーが発生した場合でも、今
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
ような何かを行うことができるかもしれません、あなたはまだfoo
を持っている、とbaz
変数が設定されており、彼らができますレスキューブロックで使用することができます。
基本的には、try
以外の変数を設定してください。 Thisは、try ... rescue
の可変スコープの概要を少ししか示していません。
これを念頭に置いて、スーパーバイザーをセットアップして、GenServer
(または実際に監督された他のプロセス)の内部でこれを行う方がよい場合があります。そうすれば、それがクラッシュした場合、監督者はそれをどうするかを決めることができます。 ElixirとErlangの両方が、防御的にプログラムしようとするのではなく、「クラッシュさせる」という考え方のものです。
真剣に - これはgen_server経由で行います。プロセス内のリソースをスピンアップします。 –