これは良い質問です。少し研究した後です。
詳細についてはどういう違いがありますか?
ホセの答え:
主に、あなたが開発者のミスや例外的な状況の下で発生したエラーの制御フローおよび予備raise
、ためthrow
を使用する必要があります。エリクサーで
は、この区別はかなり理論的であるが、彼らは に重要で例外オブジェクトを作成し、 バックトレースが高価であるため、高価である 制御フローのためにエラー/例外を使用してルビー、のようないくつかの言語。
- 特定のユースケースで使用するにはどうすればよいですか?
raise/rescue
が明示的に例外処理(プログラマ・エラーのようないくつかの不測の事態、間違った環境など)程度と/救助を上げる考えてみましょう:
この答えまもなくWhich situations require throw catch in Elixir
を確認してください。
throw/catch
あなたは失敗を期待している場所で便利です。 典型的な例は以下のとおりです。深くネストされた再帰呼び出し出
1つ:
- 「throwとcatchを使用しない限り、値を取得できない状況」は正確には何ですか?
Supervisor
で管理されているプロセスからコードを実行しようとしているが、予期しない理由でプロセスが終了するとします。
try do
IO.inspect MayRaiseGenServer.maybe_will_raise
rescue
RuntimeError -> IO.puts "there was an error"
end
MayRaiseGenServer
は
Supervisor
監修され、何らかの理由でエラーが発生しました:
try do
IO.inspect MayRaiseGenServer.maybe_will_raise # <- Code after this line is no longer executed
をそして、あなたはここで例外のキャッチを使用して思い付くことができます。
try do
IO.inspect MayRaiseGenServer.maybe_will_raise
catch
:exit, _ -> IO.puts "there was an error"
end
[OK]を私たちが探しているものを十分に明確にすることを願っています。
あなたはそれらをまったく使用しないでください;)すべてのエラーを '試して、キャッチする 'のはJavaではありません。エラーが発生したときにスーパーバイザを使用して、アプリを堅牢にするか、エラーが発生するたびにraiseを使用する必要があります。 – PatNowak
[エリクサーで投げ捨てる必要がある状況]の可能な複製?(http://stackoverflow.com/questions/36036480/which-situations-require-throw-catch-in-elixir) –