Sono entrato in una discussione con un collega collega su un pezzo di codice. Mentre lui pensa che sia ok, io no. Ma non ho più argomenti di quelli che chiamare lo stesso metodo (ricorsione) in un blocco catch non è una buona pratica.
Quindi ecco uno pseudocodice di ciò di cui stiamo discutendo:
public String someMethod( SomeType param1, SomeType param2 ..., int attempts ){
int max_attempts = 5;
try{
//doSomething here;
return result;
}catch (Exception e){
if ( attempts == max_attempts ){
throw new RuntimeException(e);
}
//log exception
//sleep for some time
//here is the part I do not agree.
return someMethod( param1, param2 ..., attempts+1 );
}
}
Il mio suggerimento è di avere una struttura come questa:
public String someMethod( SomeType param1, SomeType param2... )
throws Exception /*or whatever*/{
//do something
return result;
}
public String executeProcess( SomeType param1, SomeType param2 ... ){
int attempts = 0;
boolean ok = false;
String result;
do{
try{
result = someMethod( param1, param2... );
ok=true;
}catch( /*specific exceptions here*/ e ){
attempts++;
//log exception
//sleep for some time
}
}while( !ok || attempts<5 ); //just to be clear 5 here would be a constant
if ( attempts >= 5 ){
throw new RuntimeException(e);
}
return result;
}
Nella mia soluzione potrebbe persino evolversi in qualcosa di ancora più elegante come una classe esecutore con una lista di processi e priorità, ecc. (ovviamente solo se necessario).
Quindi quale di questi è il miglior modo di agire e quali sarebbero gli argomenti per difenderlo (pro e contro).
Ciò che someMethod
fa è creare un HttpURLConnection
e inviare una richiesta POST
a un webservice che restituirà una stringa JSON
che verrà quindi gestita e convertita in un oggetto al di fuori del contesto di questo metodo (la parte di conversione).
Tutta la gestione delle eccezioni sarà basata sulla connessione con il webservice.
Quello che ho dimenticato di menzionare qui è che la sua versione del codice è già in produzione da molto tempo, quindi non ci sono "bug di programmazione". Le uniche eccezioni che sono state lanciate sono quelle relative alla connessione / timeout (qualsiasi cosa) relative al servizio web.
Ho persino parlato con lui per andare al file di log (cronologia) e ottenere tutte le eccezioni specifiche e inserire il blocco catch.
Considerando che le eccezioni che sono state gestite saranno quelle specifiche, quale sarebbe la soluzione migliore?