web-dev-qa-db-ja.com

Scalaでの未チェックの例外の決定

Javaプログラマーとして、私は常にチェックされない例外を批判してきました。ほとんどのプログラマーは、コーディングの容易さへの道としてそれを後でトラブルを発生させるためだけに使用します。例外は、チェックされていないものに比べてはるかに堅牢です。

驚いたことに、ScalaにはChecked Exceptionsと呼ばれるものはありません。 Scalaでは、すべてのJavaオンとオフのチェックが外されています。

この決定の背後にある動機は何ですか?私にとっては、外部コードを使用するときに、さまざまな問題が発生します。そして、偶然にもドキュメンテーションが不十分な場合、それはキルになります。

17
Jatin

チェックされた例外は、ほとんどが失敗と見なされます。 Javaの後に作成された言語がないことに注意してください。 http://www.artima.com/intv/handcuffs2.html を参照してください http:/ /googletesting.blogspot.ru/2009/09/checked-exceptions-i-love-you-but-you.htmlhttp://www.mindview.net/Etc/Discussions/CheckedExceptions など.

特に、それらは合成できません(throws Exceptionに戻すことを除いて)。

Scalaより良いオプションがあります:Option[T]Either[Exception, T]などの戻り値に代数型を使用して、ユーザーに特定のケースを処理させたい場合(例えばの代わりに

def foo: Int // throws FileNotFoundException, IllegalStateException

あなたが持っている

sealed trait FooResult
case class Success(value: Int) extends FooResult
case class FileNotFound(file: File) extends FooResult
case object IllegalState extends FooResult

def foo: FooResult

そして消費者は今すべての結果を処理する必要があります)

例外をスローする外部コードを処理するには、 scala.util.control.exception またはscala.util.Try(Scala 2.10で始まる)があります。

29
Alexey Romanov

チェック例外Javaの場合はそれほど悪いことではありません。もちろん、ADTはScalaの方が適切なオプションかもしれませんが、Javaでは、チェックされた例外がその場所にあり、tidy code引数は、ブログの数に関係なく無意味なナンセンスです)繰り返します。基本的に、ねじタイプのシステムprettyコードはシステムを自動的に堅牢にするため、システムで発生する可能性のある深刻でおそらく修復可能な状態を無視するべきだと述べています。 Javaコーダーは自発的にコードをXMLに移動します(Spring、Mavenなど。prettyの部分はここにあります)。

Scala M. Oderskyが以下に示す)でチェック例外が不足している理由 http://www.scala-lang.org/old/node/8787.html 当然のことながら異なり、理にかなっています。

チェック例外の問題は、リストのmapメソッドで最もよく示されます。

def map[B](f: A => B): List[B]

@throwsでマップに注釈を付ける方法は? mapが@throwsアノテーション自体を取得しない場合、おそらく@throwsを持つ関数を渡すことはできません。これは、マップを使用する方法に厄介な制限と区別を導入します。関数の引数がスローするすべての例外をマップがスローすることをなんとかして述べることができれば、さらに良いでしょう。これを表現できるエフェクトシステムはいくつかありますが、これまでのところ、私が見たすべての表記は重すぎます。

Lukas Rytzは、マップのタイプや他の一般的な機能を簡潔かつ正確に表現するために使用できる軽量エフェクトシステムについていくつかの研究を行っています。それは研究であるため、現時点では、私たちがどの程度成功するか、そしてどれだけがScalaに投入できるかは不明です。理想的には、オプションの型システムとしていつか追加できるようになるでしょう。しかし、具体的な予測を行うには時期尚早です。

乾杯

わかりませんが、Java= 8ラムダもチェックされていない例外に制限されていると思います。 JDK 8のほとんど(すべて?)の新しい機能インターフェースのメソッド(Java.util.function.*)チェックされていない例外も宣言しないでください。

7
woky

効率を上げたい場合は、あきらめる必要があります。精度/制御<-そのためのより良いWordが必要です。

Scalaは、抽象化に関する限り、上位に位置しています。 Scalaの目標の1つが迷惑なボイラープレートコードを取り除くことである場合、Javaの例外処理を確認するのは明らかです。 Javaで高速なコードを記述したい場合は、チェックされた例外がmain()に到達し、事実上チェックされなくなるまで、例外をスローし続けるだけです。

私があなたが尋ねていることを正確に理解しているかどうかはわかりませんが、これは私の意見では最も明白な理由です。

まあ、私は少し見て、誰かが チェック例外の悲劇 について書いています。

2
David Cowden