Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ausnahmslos? – Wie man ohne Exceptions auskommt

Lars Hupel
February 25, 2012

Ausnahmslos? – Wie man ohne Exceptions auskommt

Lars Hupel

February 25, 2012
Tweet

More Decks by Lars Hupel

Other Decks in Programming

Transcript

  1. Anderswo In Java Missbrauch Java 8? Validation Fahrplan Fehlerbehandlung anderswo

    Fehlerbehandlung in Java Wie Exceptions missbraucht werden (können) Exceptions und Lambdas in Java 8? Modellierung von Exceptions mittels Validation Lars Hupel Ausnahmslos? 25. Februar 2012 3 / 32
  2. Anderswo In Java Missbrauch Java 8? Validation Low-Level-Fehlerbehandlung Am Anfang

    war der Interrupt. Lars Hupel Ausnahmslos? 25. Februar 2012 4 / 32
  3. Anderswo In Java Missbrauch Java 8? Validation Fehlerbehandlung in C

    FILE * file = fopen("input", "r"); if (!file) printf("%d %s\n", errno, strerror(errno)); mögliche Werte für errno: EACCES, EFAULT, EINTR, ELOOP, EMFILE, ENAMETOOLONG, ... Lars Hupel Ausnahmslos? 25. Februar 2012 5 / 32
  4. Anderswo In Java Missbrauch Java 8? Validation Fehlerbehandlung in C++

    C++ kennt Exceptions. void e1() throw(std::exception) { throw 5; } void e2() throw() { throw std::exception(); } void e3() { throw; } Lars Hupel Ausnahmslos? 25. Februar 2012 6 / 32
  5. Anderswo In Java Missbrauch Java 8? Validation Exceptions in Java

    Java setzt vollständig auf Exceptions Unterscheidung: checked/unchecked Checked exceptions müssen deklariert oder abgefangen werden Lars Hupel Ausnahmslos? 25. Februar 2012 7 / 32
  6. Anderswo In Java Missbrauch Java 8? Validation Exceptions in Java

    Demo exc.java exc.scala Lars Hupel Ausnahmslos? 25. Februar 2012 8 / 32
  7. Anderswo In Java Missbrauch Java 8? Validation Checked exceptions VM

    Spec § 4.7.4 “A method should throw an exception only if at least one of the following three criteria is met: 1. The exception is an instance of RuntimeException [...] 2. The exception is an instance of Error [...] 3. The exception is [...] specified in the exception_index_table [...] These requirements are not enforced in the Java virtual machine; they are enforced only at compile time.” Lars Hupel Ausnahmslos? 25. Februar 2012 9 / 32
  8. Anderswo In Java Missbrauch Java 8? Validation Checked exceptions und

    Type erasure Demo Unchecked.java Lars Hupel Ausnahmslos? 25. Februar 2012 10 / 32
  9. Anderswo In Java Missbrauch Java 8? Validation Exceptions und Generics

    Exceptions unterliegen Type Erasure catch-Block im Wesentlichen instanceof-Test Exceptions dürfen nicht generisch sein Lars Hupel Ausnahmslos? 25. Februar 2012 11 / 32
  10. Anderswo In Java Missbrauch Java 8? Validation Type casing in

    Java if (tree instanceof Leaf) { ((Leaf) tree).getValue() } kein Exhaustiveness-Check tree behält den Typ Tree Compiler kann Korrektheit nicht prüfen Lars Hupel Ausnahmslos? 25. Februar 2012 12 / 32
  11. Anderswo In Java Missbrauch Java 8? Validation Type casing in

    Java if (tree instanceof Leaf) { ((Leaf) tree).getValue() } kein Exhaustiveness-Check tree behält den Typ Tree Compiler kann Korrektheit nicht prüfen Lars Hupel Ausnahmslos? 25. Februar 2012 12 / 32
  12. Anderswo In Java Missbrauch Java 8? Validation Type casing in

    Java Im Vergleich dazu: catch (IOException ex) { ex.printStackTrace(); } Exhaustiveness-Check im Catch-Block hat ex den Typ IOException Compiler prüft Korrektheit Lars Hupel Ausnahmslos? 25. Februar 2012 13 / 32
  13. Anderswo In Java Missbrauch Java 8? Validation Type casing in

    Java Im Vergleich dazu: catch (IOException ex) { ex.printStackTrace(); } Exhaustiveness-Check im Catch-Block hat ex den Typ IOException Compiler prüft Korrektheit Lars Hupel Ausnahmslos? 25. Februar 2012 13 / 32
  14. Anderswo In Java Missbrauch Java 8? Validation Type casing in

    Java Demo Tree.java Depth.java Lars Hupel Ausnahmslos? 25. Februar 2012 14 / 32
  15. Anderswo In Java Missbrauch Java 8? Validation Exceptions und Lambdas

    interface F<T, R, E extends Throwable> { R f(T t) throws E; } konkrete Syntax ist noch unklar Beispiel: {T=>R throws E} Verwendung mit Varianz: F<? θ T, ? θ R, ? θ E> Lars Hupel Ausnahmslos? 25. Februar 2012 15 / 32
  16. Anderswo In Java Missbrauch Java 8? Validation Exceptions und Lambdas

    interface F<T, R, E extends Throwable> { R f(T t) throws E; } konkrete Syntax ist noch unklar Beispiel: {T=>R throws E} Verwendung mit Varianz: F<? θ T, ? θ R, ? θ E> Lars Hupel Ausnahmslos? 25. Februar 2012 15 / 32
  17. Anderswo In Java Missbrauch Java 8? Validation Exceptions und Lambdas

    interface F<T, R, E extends Throwable> { R f(T t) throws E; } konkrete Syntax ist noch unklar Beispiel: {T=>R throws E} Verwendung mit Varianz: F<? super T, ? θ R, ? θ E> Lars Hupel Ausnahmslos? 25. Februar 2012 15 / 32
  18. Anderswo In Java Missbrauch Java 8? Validation Exceptions und Lambdas

    interface F<T, R, E extends Throwable> { R f(T t) throws E; } konkrete Syntax ist noch unklar Beispiel: {T=>R throws E} Verwendung mit Varianz: F<? super T, ? extends R, ? θ E> Lars Hupel Ausnahmslos? 25. Februar 2012 15 / 32
  19. Anderswo In Java Missbrauch Java 8? Validation Exceptions und Lambdas

    interface F<T, R, E extends Throwable> { R f(T t) throws E; } konkrete Syntax ist noch unklar Beispiel: {T=>R throws E} Verwendung mit Varianz: F<? super T, ? extends R, ? extends E> Lars Hupel Ausnahmslos? 25. Februar 2012 15 / 32
  20. Anderswo In Java Missbrauch Java 8? Validation Exceptions und Lambdas

    F<? super T, ? extends R, ? extends E> T verhält sich kontravariant R und E verhalten sich kovariant F#f liefert entweder R oder E Lars Hupel Ausnahmslos? 25. Februar 2012 16 / 32
  21. Anderswo In Java Missbrauch Java 8? Validation Exceptions und Lambdas

    F<? super T, ? extends R, ? extends E> T verhält sich kontravariant R und E verhalten sich kovariant F#f liefert entweder R oder E Lars Hupel Ausnahmslos? 25. Februar 2012 16 / 32
  22. Anderswo In Java Missbrauch Java 8? Validation Exception als Rückgabewert

    interface F<T, R, E extends Throwable> { Either<E, R> f(T t); } Either<E, R> ist ein Interface mit genau zwei Subklassen: 1. Left<E> für den Fehlerfall 2. Right<R> für den Erfolgsfall Lars Hupel Ausnahmslos? 25. Februar 2012 17 / 32
  23. Anderswo In Java Missbrauch Java 8? Validation Either Welche Operationen

    muss Either anbieten? eine Funktion im Erfolgsfall anwenden eine Funktion im Fehlerfall anwenden einen Defaultwert zurückgeben eine Funktion anwenden, die fehlschlagen kann Lars Hupel Ausnahmslos? 25. Februar 2012 18 / 32
  24. Anderswo In Java Missbrauch Java 8? Validation ... und Halbgruppen

    http://golem.ph.utexas.edu/category/2012/01/vorsicht_funktor.html Lars Hupel Ausnahmslos? 25. Februar 2012 19 / 32
  25. Anderswo In Java Missbrauch Java 8? Validation Operationen auf Listen

    map: List<B> map(List<A> list, F<A, B> f) mapAll: List<B> map(List<A> list, List<F<A, B>> fs) Lars Hupel Ausnahmslos? 25. Februar 2012 20 / 32
  26. Anderswo In Java Missbrauch Java 8? Validation Operationen auf Listen

    Verallgemeinerung Funktor: M[A] => (A => B) => M[B] Applicative: M[A] => M[A => B] => M[B] Lars Hupel Ausnahmslos? 25. Februar 2012 21 / 32
  27. Anderswo In Java Missbrauch Java 8? Validation Validation isomorph zu

    Either Fälle: Failure und Success für Validation kann map definiert werden aber: was ist M[_]? ({ type λ[α] = Validation[E, α]})#λ Lars Hupel Ausnahmslos? 25. Februar 2012 22 / 32
  28. Anderswo In Java Missbrauch Java 8? Validation Validation isomorph zu

    Either Fälle: Failure und Success für Validation kann map definiert werden aber: was ist M[_]? ({ type λ[α] = Validation[E, α]})#λ Lars Hupel Ausnahmslos? 25. Februar 2012 22 / 32
  29. Anderswo In Java Missbrauch Java 8? Validation Validation isomorph zu

    Either Fälle: Failure und Success für Validation kann map definiert werden aber: was ist M[_]? ({ type λ[α] = Validation[E, α]})#λ Lars Hupel Ausnahmslos? 25. Februar 2012 22 / 32
  30. Anderswo In Java Missbrauch Java 8? Validation Validation isomorph zu

    Either Fälle: Failure und Success für Validation kann map definiert werden aber: was ist M[_]? ({ type λ[α] = Validation[E, α]})#λ Lars Hupel Ausnahmslos? 25. Februar 2012 22 / 32
  31. Anderswo In Java Missbrauch Java 8? Validation Fehlerakkumulation Sammeln von

    Eingabewerten, Produzieren eines Ausgabewerts beim Sammeln können Fehler auftreten schlecht: “Fail fast” besser: alle Fehler sammeln, dann melden Lars Hupel Ausnahmslos? 25. Februar 2012 23 / 32
  32. Anderswo In Java Missbrauch Java 8? Validation Fehlerakkumulation Sammeln von

    Eingabewerten, Produzieren eines Ausgabewerts beim Sammeln können Fehler auftreten schlecht: “Fail fast” besser: alle Fehler sammeln, dann melden Lars Hupel Ausnahmslos? 25. Februar 2012 23 / 32
  33. Anderswo In Java Missbrauch Java 8? Validation Halbgruppen und Monoide

    http://scienceblogs.com/goodmath/2008/02/full_circle_the_categorical_mo.php Lars Hupel Ausnahmslos? 25. Februar 2012 24 / 32
  34. Anderswo In Java Missbrauch Java 8? Validation Halbgruppen Ein Typ

    stellt eine Halbgruppe dar, wenn dieser eine zweistellige Operation ◦ anbietet für die gilt: a ◦ (b ◦ c) = (a ◦ b) ◦ c (Assoziativität) Lars Hupel Ausnahmslos? 25. Februar 2012 25 / 32
  35. Anderswo In Java Missbrauch Java 8? Validation Halbgruppen ... in

    Code interface Semigroup<A> { /** * Associative addition operation. */ A sum(A a1, A a2); } Lars Hupel Ausnahmslos? 25. Februar 2012 26 / 32
  36. Anderswo In Java Missbrauch Java 8? Validation Halbgruppen Beispiele (int,

    *) (String, +) für alle A: (List<A>, append) Lars Hupel Ausnahmslos? 25. Februar 2012 27 / 32
  37. Anderswo In Java Missbrauch Java 8? Validation Halbgruppen Beispiele (int,

    *) (String, +) für alle A: (List<A>, append) Lars Hupel Ausnahmslos? 25. Februar 2012 27 / 32
  38. Anderswo In Java Missbrauch Java 8? Validation Listen zur Fehlerakkumulation

    Idee: Validation<List<E>, A> aber: Was bedeutet Failure(List())? Problem: List erlaubt leere Listen Lars Hupel Ausnahmslos? 25. Februar 2012 28 / 32
  39. Anderswo In Java Missbrauch Java 8? Validation Listen zur Fehlerakkumulation

    Idee: Validation<List<E>, A> aber: Was bedeutet Failure(List())? Problem: List erlaubt leere Listen Lars Hupel Ausnahmslos? 25. Februar 2012 28 / 32
  40. Anderswo In Java Missbrauch Java 8? Validation Listen zur Fehlerakkumulation

    Idee: Validation<List<E>, A> aber: Was bedeutet Failure(List())? Problem: List erlaubt leere Listen Lars Hupel Ausnahmslos? 25. Februar 2012 28 / 32
  41. Anderswo In Java Missbrauch Java 8? Validation Listen zur Fehlerakkumulation

    Lösung: Nichtleere Listen class NonEmptyList<A> { public final A head; public final List<A> tail; } Lars Hupel Ausnahmslos? 25. Februar 2012 29 / 32
  42. Anderswo In Java Missbrauch Java 8? Validation Fehlerakkumulation im Einsatz

    Demo Validation.scala Lars Hupel Ausnahmslos? 25. Februar 2012 30 / 32
  43. Anderswo In Java Missbrauch Java 8? Validation Fazit “Non-breaking error

    handling is just an applicative functor on a partially applied disjoint union type constructor with semigroup error elements so what’s the big deal?” – Tony Morris Lars Hupel Ausnahmslos? 25. Februar 2012 31 / 32