J'ai une préférence personnelle pour les unchecked-exceptions, mais les checked-exceptions n'avait jamais été un gros problème pour moi jusque là.
Avec les interfaces fonctionnelles cela s'avère souvent fastidieux.
Exemple tout bête : ce code là ne peut pas marcher car Files.lines() peut remonter une IOException.
1 2 3 4 5 6 7 8 9 10
| public Set<String> getAllWords(Path directory) throws IOException {
Pattern separator = Pattern.compile("\\W+");
return Files.walk(directory) // On recherche tous les fichier du répertoire
.filter(p -> p.getFileName().toString().endsWith(".java")) // Avec l'extension .java
.flatMap(p -> Files.lines(p, StandardCharsets.UTF_8)) // Dont on lit toutes les lignes
.map(String::trim) // On supprime les blancs
.filter(s -> !s.isEmpty()) // On ignore les lignes vides
.flatMap(line -> separator.splitAsStream(line)) // Et on y recherche toutes les mots
.collect(Collectors.toSet()); // Que l'on rajoute dans un Set
} |
Il faut impérativement traiter l'exception, ce qui alourdit considérablement la chose :
.flatMap(p -> Files.lines(p, StandardCharsets.UTF_8)) // Dont on lit toutes les lignes
Devient :
1 2 3 4 5 6 7
| .flatMap(p -> {
try {
return Files.lines(p, StandardCharsets.UTF_8);
} catch (IOException e) {
throw new UndeclaredThrowableException(e);
}
}) // Dont on lit toutes les lignes |
En plus d'être bien lourd, je trouve le code moins propre puisqu'il ne remonte plus directement une IOException.
Si je veux que ce soit bien propre et que ca me remonte une IOException, je dois retraiter l'exception :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public Set<String> getAllWords(Path directory) throws IOException {
Pattern separator = Pattern.compile("\\W+");
try {
return Files.walk(directory) // On recherche tous les fichier du répertoire
.filter(p -> p.getFileName().toString().endsWith(".java")) // Avec l'extension .java
.flatMap(p -> {
try {
return Files.lines(p, StandardCharsets.UTF_8);
} catch (IOException e) {
throw new UneUncheckedExceptionPerso(e);
}
}) // Dont on lit toutes les lignes
.map(String::trim) // On supprime les blancs
.filter(s -> !s.isEmpty()) // On ignore les lignes vides
.flatMap(line -> separator.splitAsStream(line)) // Et on y recherche toutes les mots
.collect(Collectors.toSet()); // Que l'on rajoute dans un Set
} catch (UneUncheckedExceptionPerso e) {
throw e.getOriginalIOException();
}
} |
Pour peu qu'il y ait plusieurs unchecked-exception ca devient atroce !
Partager