2016-03-16 12 views
6

エリクシルの文書の中で、私といくつかの友人のために会話が起こった。エリクサーで投げ捨てる必要のある状況は?

エリクシルでは、値をスローして後で捕まえることができます。スローアンドキャッチ は、 の値を取得できない状況で予約されています(スローとキャッチを使用しない限り)。

これらの状況は、適切なAPIを提供していないライブラリとのインターフェイスである を除いて、実際にはまれです。

try/throw/catchtry/rescueのどちらの状況が必要なのですか?既存のErlangライブラリとインタフェースするためのものですか?ページのサンプルは私がちょっと混乱していることを示すエリクシールコードを示しています。

私が探しているはずの「適切なAPI」は何ですか?これはプロトコルだろうか?

+0

Dave Thomasの書籍には、データベースがダウンしたりネームサーバーが応答しなかったり、名前が固定された構成ファイルを開くことができなかったなどのいくつかの例があります。 – GavinBrelstaff

+0

なぜこれらの状況は救助ではなくキャッチが必要ですか?それが私が求めていることです。違いは何ですか? –

+1

もう少し詳しく調べておくべきだった。しばらく前にElixir Core Listで質問されたようなものでした。https://groups.google.com/d/topic/elixir-lang-core/0eG2BqKfC_U/discussion –

答えて

9

私はraise/rescueを例外処理について明示的に考える - stacktraceとプログラマーがそれを見たいと思っているところの全く予期しない状況を意味する。プログラマエラー、間違った環境など複数のことが起こる可能性がありますが、無効なデータを提供するユーザはそのようなケースの1つではありません。

Throw/catchは、障害が予想される場所でも有効ですが、raise/rescueで提供されている非ローカルコントロールフローを使用したい場合に便利です。これにより、時にはかなりのスタックトレースを構築するコストをスキップすることもできます。典型的な例は以下のとおりです。深くネストされた再帰呼び出し出

私のルールは、そのキャッチだろう救助は一般的なケースでは、取り外し可能でなければなりませんしながら、適切にプログラムを機能させるために不可欠です。もちろん、そのルールには例外がありますが、それは有用な第1レベルの区別だと思います。

+2

あなたのコメントとJoseさんの回答--doesはスタックトレースを生成してスローしません。それは顕著な違いの1つですか? –

関連する問題