Ambito di gestione delle eccezioni quando si gestiscono eccezioni nidificate

0

Supponiamo di avere un oggetto con due metodi che generano eccezioni diverse. Questi metodi devono essere usati insieme. Ad esempio:

SqlCon{
  static SqlCon connect(string user, string pass) throws UnableToConnect;
  string[] query(string query) throws BadQueryExcep;
}

Opzioni 1.

try{
   SqlCon s = connect("user", "pass");
   s.query("myquery");

}catch(UnableToConnect e || BadQueryExcep b){
  //do something with error
}

Opzione 2.

 try{
       SqlCon s = connect("user", "pass");
       try{
         s.query("myquery");
       }catch(BadQueryExcep b){
        //do something with different error
       }


    }catch(UnableToConnect u){
      //do something with error
    }

Opzione 3.

SqlCon s;

try{
   s = connect("user", "pass");


}catch(UnableToConnect e){
  //do something with error
  return;
}
try{
   s.query("myquery");
}catch(BadQueryExcep b){
  //do something with different error
}

Opzioni 4.

try{
   SqlCon s = connect("user", "pass");
   s.query("myquery");

}catch(UnableToConnect e){
  //do something with e
}catch(BadQueryExcep b){
 //do something with b
}

L'opzione 4 mi sembra la più pulita, ma se ci fossero un sacco di istruzioni all'interno del blocco try {..}, ti nasconderai dove si è verificata l'eccezione.

Quale opzione sceglieresti e perché? Quale opzione non sceglieresti e perché? Sono disponibili migliori opzioni (operando entro i limiti della domanda ... non dire semplicemente 'Dovresti lanciare l'eccezione')?

    
posta horvste 29.01.2015 - 22:02
fonte

1 risposta

1

Opzione 1 o 4. Gli altri aggiungono molta confusione visiva senza migliorare il comportamento in alcun modo.

Supponendo che queste eccezioni abbiano messaggi di errore ragionevolmente descrittivi (es., "Impossibile connettersi al database", "Errore di sintassi nella query dopo 'SELEZIONA' token", ecc.) a cui puoi accedere tramite il solito e.what() , quindi Opzione 1 è probabilmente il migliore perché probabilmente utilizzerai lo stesso identico codice per gestire entrambi i tipi di eccezioni. Se per qualche motivo hai bisogno di gestire i due tipi di eccezione in modo diverso, allora l'opzione 4 è migliore.

Si noti che "nascondere dove si è verificata l'eccezione" non è affatto un problema fintanto che i messaggi di errore sono ragionevolmente descrittivi (e se non lo sono, questo è il primo problema da affrontare). Soprattutto nel contesto dei database, il messaggio di errore probabilmente ti dice molto di più di quale linea di codice lo ha lanciato.

Oltre al problema di leggibilità, con le Opzioni 2 e 3 il blocco try-catch primo / interno probabilmente usa le eccezioni come flusso di controllo, che tutti conosciamo è un anti-pattern per molte altre ragioni.

    
risposta data 30.01.2015 - 00:07
fonte

Leggi altre domande sui tag