Considera le seguenti c # codice:
public class ExceptionManager
{
public static void TreatException(Exception ex)
{
if (ShowAndContinue(ex))
// display a user-friendly message on what happened and let the app run.
else
throw ex;
}
// (more code)
}
(Si noti che quanto sopra è troppo semplificato in modo che l'attenzione sia focalizzata sulla mia preoccupazione)
IMHO Penso che il modo in cui viene lanciata l'eccezione sia sbagliato perché le informazioni di stacktrace sono perse. Il modo preferito (di nuovo, IMHO) per scrivere la riga throw
sarebbe questo:
throw new UntreatableErrorException("Manager could not treat the exception.", ex);
In questo modo viene conservato lo stacktrace dell'eccezione originale.
Tuttavia, un mio collega sta sostenendo che fare ciò significherebbe perdere la capacità di catturare l'eccezione originale più bassa nello stack di chiamate, perché catch
funziona con il tipo di eccezione e quindi una trappola di eccezione potrebbe essere impostata per catturare l'originale eccezione ma non UntreatableErrorException
. Pertanto è meglio restituire l'istanza di eccezione originale, anche se ciò significa perdere lo stacktrace.
Quale di noi è proprio qui su quale dovrebbe essere la migliore pratica?