Não é um antipadrão em si, mas um padrão de código que informa que você precisa refatorar.
E é bem fácil, você só precisa conhecer uma regra prática que está escrevendo não mais do que um bloco try no mesmo método. Se você conhece bem escrever códigos relacionados juntos, geralmente é apenas copiar e colar cada bloco try com seus blocos catch e colá-lo dentro de um novo método e, em seguida, substituir o bloco original por uma chamada para esse método.
Esta regra é baseada na sugestão de Robert C. Martin em seu livro 'Clean Code':
se a palavra-chave 'try' existir em uma função, ela deve ser a primeira palavra na função e que não deve haver nada após os blocos catch / finalmente.
Um exemplo rápido de "pseudo-java". Suponha que tenhamos algo assim:
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;
}
}
}
Podemos refatorar cada tentativa de captura e, nesse caso, cada bloco de tentativa e captura tenta a mesma coisa, mas em locais diferentes (como conveniente: D), temos apenas que copiar e colar um dos blocos de tentativa e captura e fazer um método dele .
public String loadConfigFile(String path) {
try {
FileInputStream is = new FileInputStream(path);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
Agora usamos isso com o mesmo objetivo de antes.
String[] paths = new String[] {PATH_ONE, PATH_TWO, PATH_THREE};
String configData;
for(String path : paths) {
configData = loadConfigFile(path);
if (configData != null) {
break;
}
}
Espero que ajude :)