Überprüfte Ausnahmen in Java sind keine schlechte Sache. Natürlich sind ADTs für Scala die bessere Option, aber in Java haben überprüfte Ausnahmen ihren Platz und das saubere Codeargument ist einfach ahnungslos, egal wie viele Blogs es wiederholt haben. Grundsätzlich heißt es, dass Sie strenge und möglicherweise reparierbare Bedingungen, die in Ihrem System auftreten können, gerne ignorieren sollten, da schraubenartiges System, hübscher Code, Ihr System automatisch robust macht. Solche Überlegungen erklären auch, warum so viele Java-Codierer freiwillig ihren Code in XML-Dateien verschieben (Spring, Maven usw.). Ich vermisse jedoch den hübschen Teil hier.
Der von M. Odersky unter http://www.scala-lang.org/old/node/8787.html angegebene Grund für das Fehlen geprüfter Ausnahmen in Scala ist nicht überraschend anders und sinnvoll.
Das Problem mit aktivierten Ausnahmen lässt sich am besten anhand der Kartenmethode in Listen veranschaulichen:
def map[B](f: A => B): List[B]
Wie kommentiere ich eine Karte mit @throws? Wenn map selbst keine @ throws-Annotation erhält, können Sie ihr vermutlich keine Funktion mit einem @ throws übergeben. Dies würde zu umständlichen Einschränkungen und Unterscheidungen bei der Verwendung der Karte führen. Die Dinge wären besser, wenn wir irgendwie sagen könnten, dass map alle Ausnahmen auslöst, die sein Funktionsargument auslöst. Es gibt einige Effektsysteme, die dies ausdrücken können, aber bisher ist jede Notation, die ich gesehen habe, zu schwer.
Lukas Rytz forscht an leichten Effektsystemen, mit denen sich die Art der Karte und andere häufig verwendete Funktionen präzise und präzise ausdrücken lassen. Es ist Forschung, daher ist derzeit unklar, inwieweit wir erfolgreich sein werden und wie viel davon in Scala fließen kann. Idealerweise können wir es irgendwann als optionales Typsystem hinzufügen. Für konkrete Vorhersagen ist es jedoch viel zu früh.
Prost
Ich bin mir nicht sicher, aber ich denke, dass Java 8-Lambdas auch auf ungeprüfte Ausnahmen beschränkt sind.Methoden in den meisten (allen?) Neuen Funktionsschnittstellen in JDK 8 ( java.util.function.*
) deklarieren auch keine ungeprüften Ausnahmen.