Stratégies de gestion des exceptions
Bonjour tout le monde,
Je lance une petite discussions au sujet des différentes stratégies de gestion des exceptions qui peuvent être mises en place en Java.
C'est une problématique que je rencontre assez souvent.
J'aurai aimé avoir votre retour là-dessus et que vous veniez nous présenter les stratégies que vous avez vous-même mises en place.
Merci de vos contributions.
Pierre.
et si les exceptions vous em...bètent
bon je n'ai pas pu résister au plaisir (pervers) du hack au sujet des exceptions (attention contient du java 8)
Code:
1 2 3 4 5
|
@FunctionalInterface
public interface PeskyConsumer<X,T extends Throwable> {
public void accept(X arg) throws T ;
} |
Bon jusque là on a juste un Consumer qui a des problèmes d'exceptions
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
//d'accord il y a de l'abus ce n'est pas une interface mais une classe avec uniquement des méthodes statiques
public interface Teflon {
public default <X, T extends Throwable> Consumer<X> teflonize(final PeskyConsumer<X,T> consumer) {
return new Consumer<X>() {
@Override
public void accept(X t) {
try {
consumer.accept(t);
} catch (Throwable exc) {
Teflon.<RuntimeException>forgetThrowsClause(exc);
}
}
} ;
}
public static <T extends Throwable> T forgetThrowsClause(Throwable t) throws T{
throw (T) t;
}
} |
maintenant travaux pratiques :
Code:
1 2 3 4 5 6 7
|
// code inutile (on pourrait directement appeler en "teflonizant")
class PlasticArrayList<T> extends ArrayList<T> implements Teflon{
public void forEachPesky(PeskyConsumer<T,?> pesk) {
forEach(teflonize(pesk));
}
} |
de plus en plus compliqué (sans augmentation du prix des places!)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
@FunctionalInterface
public interface MayFail {
public void check() throws Exception ;
}
public class PotentialFail implements MayFail{
boolean fail ;
static int num ;
int number = num++ ;
public PotentialFail(boolean fail) {
this.fail = fail;
}
@Override
public void check() throws Exception {
System.out.println("call " +this);
if(fail) {
throw new Exception("failed" +this) ;
}
}
public String toString() {
return "PotentailFail " + number ;
}
}
public class TestSneakyConsumer {
public static void main(String[] args) {
PlasticArrayList<PotentialFail> list = new PlasticArrayList<>() ;
list.add(new PotentialFail(false)) ;
list.add(new PotentialFail(true)) ;
list.add(new PotentialFail(false)) ;
try {
list.forEachPesky(MayFail::check);
} catch(Exception exc) {
System.err.println("got Exception" +exc);
}
}
} |
comme quoi: pourquoi faire simple quand on peut faire crade :aie: ?