Se si desidera elaborare eccezioni controllate in modo sicuro, è necessario un metodo di supporto che fornisca la possibilità di avvolgere l'eccezione in un sottotipo di RuntimeException
. Ecco una tale funzione di supporto che utilizza la sicurezza tipo di generico per garantire che solo dichiarato eccezioni sarà nuovamente gettato (a meno che non si utilizza un operazione non sicura):
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; }
}
Supporta un arbitrario action
che riceverà una funzione che fa il wrapping temporaneo del tipo di eccezione verificata su RuntimeException
. Questo wrapping sarà trasparente, il metodo attempt
si completerà normalmente o genererà l'eccezione originale verificata E
(o un'eccezione non controllata non verificata se si verifica uno).
modo da poterlo utilizzare in questo modo:
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); }
}));
}
A causa delle operazioni nidificate il compilatore è in grado di dedurre il tipo automaticamente l'eccezione. Il codice sopra riportato utilizza una dichiarazione esplicita del tipo di parametro thrower
. In alternativa puoi usare un richiamo del tipo del metodo helper come
ContainingClass.<SomeCheckedException>attempt(thrower ->
Optional.ofNullable(s).ifPresent(nonNull -> {
try { key(nonNull.get()); }
catch(SomeCheckedException e) { throw thrower.apply(e); }
}));
Ah, non pensavo che quel tasto (...) 'possa lanciare l'eccezione controllata. Tuttavia [la mia risposta] (http://stackoverflow.com/a/27900544/2711488) gestisce anche quella causa. – Holger