So che spesso catturare tutte le eccezioni (C #: catch(Exception exception){...}
) è considerato una cattiva pratica.
Tuttavia, credo che ci siano situazioni in cui è perfettamente ragionevole farlo. Ad esempio, se ho un numero di operazioni da eseguire:
foreach(var operation in operationBatch)
operation.Do();
e un batch dovrebbe avere successo nel suo insieme, o fallire nel suo insieme, sembra ragionevole?
var rollBackStack = new Stack<Operation>(operationBatch.Length);
try{
foreach(var operation in operationBatch)
{
operation.Do();
rollBackStack.Push(operation); // assuming operation is atomic and cannot both apply changes AND fail
}
} catch(Exception exception) // whatever went wrong...
{
foreach(var ranOperation in rollBackStack)
ranOperation.Undo();
throw; // or throw new MyDomainException("relevant message", exception);
}
Immagino che una versione generica della domanda sarebbe: sta prendendo tutte le eccezioni solo per eseguire qualche azione e rilanciare una pratica accettabile, o c'è un altro modo che è raccomandato? Posso pensare a qualcosa di simile
var completed = 0;
try{
foreach(var operation in operationBatch)
{
operation.Do();
++completed;
}
} finally {
if(completed != operationBatch.Length)
foreach(var ranOperation in operationBatch.Take(completed).Reverse())
ranOperation.Undo();
// no need to rethrow from finally
}
Ma sembra semplicemente una versione inutilmente più complessa del primo frammento di codice.