2016-10-27 11 views
9

背景

try/rescuetry/catchは、エリクシールのエラー処理手法です。導入ガイドのcorresponding chapterに従ってください。エリクシール - 試してみる/キャッチ対試着する?

エラーが一方try/rescue構築

を用いてレスキューすることができ、

throwcatchは、使用していない限り値を取得することができない状況のために予約されていますthrowおよびcatch

私はrescueがエラーであることを簡単に理解している

を疑問。 catchは任意の値です。しかし

  • 私はエリクサーにメカニズムをエラー処理を利用する必要がありますか?
  • これらの違いは何ですか?
  • 特定のユースケースで使用するにはどのように選択する必要がありますか?
  • throwcatch 'を使用しない限り、値を取得できない状況は、正確にはですか?
+3

あなたはそれらをまったく使用しないでください;)すべてのエラーを '試して、キャッチする 'のはJavaではありません。エラーが発生したときにスーパーバイザを使用して、アプリを堅牢にするか、エラーが発生するたびにraiseを使用する必要があります。 – PatNowak

+0

[エリクサーで投げ捨てる必要がある状況]の可能な複製?(http://stackoverflow.com/questions/36036480/which-situations-require-throw-catch-in-elixir) –

答えて

14

これは良い質問です。少し研究した後です。

  • 詳細についてはどういう違いがありますか?

    ホセの答え:

主に、あなたが開発者のミスや例外的な状況の下で発生したエラーの制御フローおよび予備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]を私たちが探しているものを十分に明確にすることを願っています。

+1

あなたの研究、ありがとう説明:) – Gavin

+0

あなたは大歓迎です:) – TheAnh