Non è un anti-pattern di per sé, ma un modello di codice che indica che è necessario refactoring.
Ed è abbastanza facile, devi solo sapere una regola empirica che non sta scrivendo più di un blocco try nello stesso metodo. Se conosci bene scrivere codice correlato insieme, di solito copi e incolla ogni blocco try con i suoi blocchi catch e lo incolli all'interno di un nuovo metodo, quindi sostituisci il blocco originale con una chiamata a questo metodo.
Questa regola empirica si basa sul suggerimento di Robert C. Martin dal suo libro "Codice pulito":
if the keyword 'try' exists in a function, it should be the very first
word in the function and that there should be nothing after the
catch/finally blocks.
Un rapido esempio su "pseudo-java". Supponiamo di avere qualcosa del genere:
try {
FileInputStream is = new FileInputStream(PATH_ONE);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
try {
FileInputStream is = new FileInputStream(PATH_TWO);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
try {
FileInputStream is = new FileInputStream(PATH_THREE);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
}
Quindi potremmo refactoring ogni try try e in questo caso ogni blocco try-catch prova la stessa cosa ma in posizioni diverse (quanto è comodo: D), dobbiamo solo copiare uno dei blocchi try-catch e fare un metodo di esso.
public String loadConfigFile(String path) {
try {
FileInputStream is = new FileInputStream(path);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
Ora lo usiamo con lo stesso obiettivo di prima.
String[] paths = new String[] {PATH_ONE, PATH_TWO, PATH_THREE};
String configData;
for(String path : paths) {
configData = loadConfigFile(path);
if (configData != null) {
break;
}
}
Spero che questo aiuti:)