[JAVA] Gestion des exceptions avec une interface fluide

C'est toujours un problème d'écrire la gestion des exceptions, alors je l'ai un peu arrangé.

Méthode qui déclenche une exception vérifiée


void raiseIOEx1(String s) throws IOException {
    if (s.equals("nagare")) {
        System.out.println("Excellent!");
        return;
    }
    throw new IOException("invalid input :".concat(s));
}

C'est difficile, mais quand il y a une méthode comme celle-ci (à part pourquoi IOException?)

Écriture normale


void usually_try_style() {
    try {
        raiseIOEx1("nagare");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Style d'écriture arrangé


void nagare_try_style() {
    Try.throwable(this::raiseIOEx1)
            .ifCatch(IOException::printStackTrace)
            .accept("nagare");
}

Vous pouvez écrire comme ça.

Vous pouvez également écrire ce qui suit pour une méthode qui renvoie une valeur.

Méthode 2 qui déclenche une exception vérifiée


String raiseIOEx2(String s) throws IOException {
    if (s.equals("nagare")) {
        return "Excellent!";
    }
    throw new IOException("invalid input :".concat(s));
}

Écriture normale


void usually_returnable_try_style() {
    try {
        String s = raiseIOEx2("nagare");
        System.out.println(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Style d'écriture arrangé


void nagare_returnable_try_style() {
    Optional<String> s = Try.throwable(this::raiseIOEx2)
            .ifCatch(IOException::printStackTrace)
            .apply("nagare");
    s.ifPresent(System.out::println);

    // or
    Try.throwable(this::raiseIOEx2)
            .ifCatch(IOException::printStackTrace)
            .apply("nagare");
            .ifPresent(System.out::println);
}

Il n'est pas recommandé de l'utiliser au niveau de l'entreprise, mais la description ci-dessus peut être faite en ajoutant les 4 classes suivantes.

public class Try {
    public static <X, A, E extends Exception> ThrowableFunc<X, A, E> throwable(
            ThrowableFunc<X, A, E> f) {
        return f;
    }

    public static <X, E extends Exception> ThrowableSpender<X, E> throwable(
            ThrowableSpender<X, E> s) {
        return s;
    }
}

@FunctionalInterface
public interface ThrowableSpender<X, E extends Exception> {
    void accept(X x) throws E;

    default Consumer<X> ifCatch(ExHandler<E> handler) {
        return (X x) -> {
            try {
                accept(x);
            } catch (Exception e) {
                @SuppressWarnings("unchecked")
                E typedE = (E) e; // is type safe
                handler.handle(typedE);
            }
        };
    }
}

@FunctionalInterface
public interface ThrowableFunc<X, A, E extends Exception> {
    A apply(X x) throws E;

    default Function<X, Optional<A>> ifCatch(ExHandler<E> handler) {
        return x -> {
            try {
                return Optional.of(apply(x));
            } catch (Exception e) {
                @SuppressWarnings("unchecked")
                E typedE = (E) e; // is type safe
                handler.handle(typedE);
            }
            return Optional.empty();
        };
    }
}

@FunctionalInterface
public interface ExHandler<E extends Exception> {
    void handle(E e);
}

Comme vous pouvez le voir en lisant le code, je triche un peu à «catch».

try {
    accept(x);
} catch (E e) {
    handler.handle(e);
}

Si vous pouvez écrire comme ça, vous ne pourrez écrire plusieurs exceptions qu'avec l'interface, ce qui semble faire beaucoup de progrès, mais c'est dommage. J'espère que vous pourrez écrire en java9.

https://github.com/mt-village/nagare

référence

Recommended Posts

Gestion des exceptions avec une interface fluide
Créez des exceptions avec une interface fluide
Branchement conditionnel avec une interface fluide
Gestion des exceptions
Exception de traitement des exceptions
Résolution avec Ruby AtCoder 1er test pratique de l'algorithme Une gestion des exceptions
Gestion des exceptions Java?
À propos de la gestion des exceptions
À propos de la gestion des exceptions
gestion des exceptions ruby
[Java] Gestion des exceptions
☾ Java / Gestion des exceptions
À propos de la gestion des exceptions Java
Gestion des exceptions Java
Je souhaite concevoir une structure pour la gestion des exceptions
Refactoriser l'implémentation du pattern Decorator avec une interface fonctionnelle
À propos de la gestion des exceptions Ruby
Pratique de gestion des exceptions (ArithmeticException)
Gestion des exceptions Spring Boot
Créons une application TODO en Java 11 Gestion des exceptions lors de l'accès à un TODO avec un ID inexistant
gestion des erreurs wsimport (une classe / interface avec le même nom "xxx" est déjà utilisée)
Une histoire à laquelle j'étais accro avec toString () d'Interface qui était proxy avec JdkDynamicAopProxy
Classes nécessitant une gestion des exceptions
Première gestion des exceptions de Java (mémoire)
[Java] Pratique de la gestion des exceptions [Exception]
[Java] À propos de la gestion des exceptions try-catch
[Ruby] Gestion des exceptions dans les fonctions
Règles d'utilisation pour la gestion des exceptions Java
Créez un terrain de jeu avec Xcode 12
Techniques de gestion des exceptions en Java
Une histoire bloquée avec NotSerializableException
J'ai créé une interface de ligne de commande avec WinMerge Plugin en utilisant JD-Core