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')?