[JAVA] Ausnahmebehandlung mit einer Fluidschnittstelle

Es ist immer mühsam, Ausnahmebehandlungen zu schreiben, deshalb habe ich es ein wenig arrangiert.

Methode, die eine aktivierte Ausnahme auslöst


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

Es ist rau, aber wenn es eine Methode wie die oben genannte gibt (abgesehen davon, warum IOException?)

Normales Schreiben


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

Arrangiertes Schreiben


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

Sie können so schreiben.

Sie können auch Folgendes für eine Methode schreiben, die einen Wert zurückgibt.

Methode 2, die eine aktivierte Ausnahme auslöst


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

Normales Schreiben


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

Arrangiertes Schreiben


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);
}

Es wird nicht empfohlen, es auf Unternehmensebene zu verwenden. Die obige Beschreibung kann jedoch durch Hinzufügen der folgenden 4 Klassen vorgenommen werden.

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);
}

Wie Sie sehen können, indem Sie den Code lesen, betrüge ich ein wenig "catch".

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

Wenn Sie so schreiben können, können Sie mehrere Ausnahmen nur mit der Benutzeroberfläche schreiben, was große Fortschritte zu machen scheint, aber es ist eine Schande. Ich hoffe du kannst in java9 schreiben.

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

Referenz

Recommended Posts

Ausnahmebehandlung mit einer Fluidschnittstelle
Erstellen Sie Ausnahmen mit einer Fluid-Schnittstelle
Bedingte Verzweigung mit fließender Schnittstelle
Ausnahmebehandlung
Ausnahmebehandlung Ausnahme
Lösen mit Ruby AtCoder 1. Algorithmus Praktischer Test Eine Ausnahmebehandlung
Java-Ausnahmebehandlung?
Informationen zur Ausnahmebehandlung
Informationen zur Ausnahmebehandlung
Behandlung von Ruby-Ausnahmen
[Java] Ausnahmebehandlung
☾ Java / Ausnahmebehandlung
Informationen zur Behandlung von Java-Ausnahmen
Behandlung von Java-Ausnahmen
Ich möchte eine Struktur für die Ausnahmebehandlung entwerfen
Refactor die Implementierung des Decorator-Musters mit einer funktionalen Schnittstelle
Informationen zur Behandlung von Ruby-Ausnahmen
Praxis der Ausnahmebehandlung (ArithmeticException)
Spring Boot-Ausnahmebehandlung
Erstellen wir eine TODO-Anwendung mit Java 11-Ausnahmebehandlung, wenn Sie mit einer nicht vorhandenen ID auf TODO zugreifen
wsimport-Fehlerbehandlung (Eine Klasse / Schnittstelle mit dem gleichen Namen "xxx" wird bereits verwendet)
Eine Geschichte, die von String () von Interface abhängig ist und von JdkDynamicAopProxy vertreten wird
Klassen, die eine Ausnahmebehandlung erfordern
Javas erste Ausnahmebehandlung (Denkmal)
[Java] Praxis der Ausnahmebehandlung [Ausnahme]
[Java] Informationen zur Behandlung von Try-Catch-Ausnahmen
[Ruby] Ausnahmebehandlung in Funktionen
Verwendungsregeln für die Behandlung von Java-Ausnahmen
Erstellen Sie einen Spielplatz mit Xcode 12
Ausnahmebehandlungstechniken in Java
Eine Geschichte, die bei NotSerializableException steckt
Ich habe mit JD-Core eine Befehlszeilenschnittstelle mit dem WinMerge Plugin erstellt