Bis dann, leb wohl.....

Manifold: Adieu und auf Wiedersehen, geprüfte Exceptions

Scott McKinney

© Shutterstock / Elesey

Moderne Sprachen setzen keine geprüften Exceptions ein. Aber man muss nicht das sinkende Schiff verlassen, um an der Erfahrung teilzuhaben. In diesem Artikel zeigt uns Scott McKinney, wie man weiterhin bei Java bleiben kann und geprüfte Exceptions vollständig neutralisiert: mit einer einfachen und neuen Ergänzung zum Manifold-Framework.

Übersicht

Die meisten gegenwärtigen JVM-Sprachen, einschließlich Scala, Kotlin und Ceylon, nehmen keine Unterscheidung zwischen geprüften und nicht-geprüften Exceptions (Ausnahmen) vor, sie alle werden als nicht-geprüft abgehandelt. Ebenso hat das .NET CLR keine geprüften Exceptions. Das ist kein Zufall, da es eine Fülle von Beweisen gibt, die ihre kollektive Entscheidung, dem Beispiel von Java nicht zu folgen, bestätigen. Weil dieses Thema jedoch sehr kontrovers sein kann, werde ich mich auf einen meiner favorisierten Autoren von Programmiersprachen, Anders Hejlsberg, und das Thema „The Trouble with Checked Exceptions“ beschränken.

Beweisstück A

Geprüfte Exceptions führen tendenziell zu einem Boilerplate-Code. Bei diesem ist zur Behandlung einer Exception eine Call Site in ein try/catch-Statement verschachtel. Die geprüfte Exception ist in eine nicht-geprüfte Exception eingeschlossen und wird zurückgeworfen:

URL url;
try {
    url = new URL("http://manifold.systems/");
} catch (MalformedURLException e) {
    throw new RuntimeException(e);  // the boilerplate of boilerplates
}
try (BufferedReader reader = new BufferedReader( new InputStreamReader(url.openStream()))) {
  reader.lines().forEach(out::println);
} catch (IOException e) {
    // Whoops! Unintentionally swallowed!
}

Man kann sehen, dass der Code mit den geprüften Exceptions unlesbarer wurde. Das ist unglücklicher Weise noch nicht das Schlimmste. Eine der Exceptions nicht zurückgeworfen, sondern ignoriert wurde. Das Unintentionally Swallowing ist eine häufige Ursache für kritische, schwer zu behebende Fehler. Am frustrierendsten ist jedoch, dass der gesamte Boilerplate-Code grundsätzlich mit der Absicht geschrieben wurde: „Ich kümmere mich nicht darum, bitte verschwinde.“ Was wirklich geschrieben werden sollte:

URL url = new URL("http://manifold.systems/");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()))) {
    reader.lines().forEach(out::println);
}

Präzise, lesbar und gut für Exceptions.

Gute Nachrichten!

Mit den neuen mnanifold-exceptions-Abhängigkeiten von Manifold, können wir nun darüber entscheiden, ob unser Java-Projekt geprüfte Exceptions erzwingt oder nicht. Ist jemand Fan von geprüften Exception, dann ist das in Ordnung — derjenige muss nichts weiter tun. Andernfalls kann man geprüfte Exceptions effektiv beseitigen und die eigene Produktivität verbessern, indem man einfache eine Abhängig und ein javac-Argument zu dem eigenen, bestehenden Projekt hinzufügt:

dependencies {
    // Add manifold-exceptions to neutralize checked exceptions
    compile group: 'systems.manifold', name: 'manifold-exceptions', version: '2019.1.11'
 
    // Add manifold-exceptions to -processorpath for javac (for Java 9+, not needed for Java 8)
    annotationProcessor group: 'systems.manifold', name: 'manifold-exceptions', version: '2019.1.11'
}
 
tasks.withType(JavaCompile) {
    options.compilerArgs += '-Xplugin:Manifold'
    options.fork = true
}

Jetzt können geprüfte Exceptions ohne Behinderung anlaufen und es wird vermieden, unansehnlichen Boilerplate-Wahnsinn zu schreiben. Zusätzlich kann man das Manifold-Plug-in für IntelliJ IDEA verwenden, um einen sauberen Code in einer angenehmen, vollständig manifold-fähigen Umgebung zu schreiben.

Viel Spaß!

Ihr könnt online mehr über die maniofold-exception-Abhängigkeit nachlesen. Wenn Ihr schon mal da seid, könnt Ihr euch auch das Manifold Framework ansehen, einschließlich der Erweiterungsmethoden, umfassenden und typsicheren Zugriff auf GraphQL, JSON und tonnenweise weiteres.

Dieser Artikel wurde ursprünglich auf der Manifold-Webseite veröffentlicht.

Verwandte Themen:

Geschrieben von
Scott McKinney
Scott McKinney
Scott McKinney is the founder and principle engineer at Manifold Systems. Previously, he was a staff engineer at Guidewire where he designed and created Gosu. He currently pounds code by the truckload while listening to way too much retro synthwave.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
4000
  Subscribe  
Benachrichtige mich zu: