2011-12-03 14 views
2

例外を処理するかどうかを決定するために、クライアントコードためにScalaの中の特定のライブラリ関数によってスローされる可能性があるすべての例外を決定するための最良の方法は何ですか?Scalaの関数がスローするすべての可能な例外を決定

Scalaは例外なくチェックしているという事実は便利ですが、私はまだ可能例外事象が特定の機能を使用するときにコードが考慮すべきことが何であるか知っていただきたいと思います。

Scalaのドキュメントライブラリのために、一般的には、例外を文書化していないようです。

はどのようにScalaのユーザーが自分のクライアントコードは、アカウントにライブラリ関数によってスローされた様々な例外的な事象を取っていることを保証していますか?

+1

FYI:スカラは、ストレートフォワード例外処理に関しては特別なことではありません。ほとんどのプログラミング言語は例外をチェックしていません... – agilesteel

+0

AFAIK、例外をスローする必要があるときはほとんどのメソッドが代わりにAitherを返すので、エラー状態を簡単に処理できます。 – aishwarya

+0

私はこのプロジェクトのステータスを知りませんが、Inhibitionsでは、(バイトコードの可能なコードパスを分析して)どの例外がスローされるかをコンパイラに確認させることができます。 Scala Days 2011のビデオはhttp://days2011.scala-lang.org/node/138/292 – Mike

答えて

7

任意のライブラリー方法は:

List(1).map(_ => throw new SomeExceptionIJustInvented) 

残念ながら、これは、洗練されたコンパイラベースの例外追跡システムが存在しない場合には、それがアップしている、ということを意味しますプログラマーには、図書館の文書化と経験に基づいてどの例外が生成されるかを理解することができます。

それは例外に対してロバストなコードを書くことは非常に重要であるならば、行くための最善の方法は、コードの比較的大きなブロックからのすべての例外をキャッチすることです。 Exceptionだけをキャッチするようにしてください。メモリ不足エラーで何もできない可能性があるので、すべてのスローダブルではありません。だから、:

try { 
    // Various stuff 
} 
catch { 
    case e: Exception => // Handle the case where stuff fails 
} 

幸い、Javaライブラリを明示的に、彼らがスローするつもりだ何を言う、とScalaのライブラリはほとんど常に非常に少ない投げて、代わりにバックOptionまたはEitherを渡したり、何かを越えて失敗したときに通知他のいくつかの方法を持っています例外をスローします。ただし、Javaライブラリを使用するScalaライブラリは、少し不透明なことがあります。たとえばIOを実行している場合、IOExceptionがスローされる可能性が非常に高い賭けです。

+0

でご覧になれます。ありがとう、質問に答えます。私はどちらかを詳しく見ていきます。 – Symfrog

2

はそのような一般的な方法はありません。特に、非finalメソッドは、例外をスローするためにオーバーライドされる可能性があります。まったくの例外を投げることができる関数の引数を取ることができ

関連する問題