Wenn Sie geprüfte Ausnahmen auf sichere Weise verarbeiten möchten, benötigen Sie eine Hilfsmethode, die die Möglichkeit bietet, die Ausnahme in einen Untertyp von RuntimeException
zu verpacken. Hier ist so eine Hilfsfunktion, die verwendet Allgemein die Typsicherheit zu gewährleisten, dass nur Ausnahmen erklärt wird wieder geworfen werden (es sei denn, Sie einen unsicheren Betrieb verwenden):
public static <E extends Throwable> void attempt(
Consumer<Function<E,RuntimeException>> action) throws E {
final class CarryException extends RuntimeException {
final E carried;
CarryException(E cause) {
super(cause);
carried=cause;
}
}
try { action.accept(CarryException::new); }
catch(CarryException ex) { throw ex.carried; }
}
Es ist eine willkürliche action
unterstützt, die eine Funktion erhalten, die tut das temporäre Umbrechen des geprüften Ausnahmetyps auf RuntimeException
. Dieser Umbruch wird transparent sein, die Methode attempt
wird entweder normal abgeschlossen oder die ursprüngliche überprüfte Ausnahme E
(oder eine nicht verwandte ungeprüfte Ausnahme, falls eine auftritt) ausgelöst.
So können Sie es wie folgt verwenden:
public static void processIterm(Supplier<Key> s)
throws SomeCheckedException {
attempt((Function<SomeCheckedException, RuntimeException> thrower) ->
Optional.ofNullable(s).ifPresent(nonNull -> {
try { key(nonNull.get()); } // assuming key may throw SomeCheckedException
catch(SomeCheckedException e) { throw thrower.apply(e); }
}));
}
Aufgrund der verschachtelten Operationen der Compiler kann nicht mehr die Ausnahme Typ automatisch schließen. Der obige Code verwendet eine explizite Deklaration des Parametertyps thrower
. Alternativ können Sie einen Typenaufruf der Hilfsmethode wie
ContainingClass.<SomeCheckedException>attempt(thrower ->
Optional.ofNullable(s).ifPresent(nonNull -> {
try { key(nonNull.get()); }
catch(SomeCheckedException e) { throw thrower.apply(e); }
}));
verwenden Ah, ich dachte nicht, dass '' Schlüssel (...) 'die geprüfte Ausnahme werfen kann. Jedoch [meine Antwort] (http://stackoverflow.com/a/27900544/2711488) behandelt auch diesen Fall. – Holger