Dipende dall'eccezione. Se ti aspetti che l'eccezione possa verificarsi ed è valida, e tu la stai effettivamente trattando , come in, hai il piano B per quella situazione, quindi non buttarlo.
Se l'eccezione interrompe il flusso di lavoro e in realtà non lo stai gestendo, procedi e registralo se lo ritieni necessario, ma a volte l'ambito del metodo corrente non ha abbastanza informazioni utili per giustificare la registrazione. A volte vorrai lanciarlo a un livello più alto con più informazioni utili, prenderlo lì, quindi registrarlo.
Ad esempio:
int DoSomething1(int userId, int transactionId) {
try {
int orgId = GetOrgId(userId);
DoSomething2(orgId);
/* ... more things ... */
} catch(MyException ex) {
Log(string.Format("{0}\nuser: {1}, trns: {2}\n\tMessage: {3}\n\t\tTrace: {4}",
ex.Message, userId, transactionId, ex.InnerException.Message, ex.InnerException.StackTrace));
throw;
} catch(Exception ex) {
Log(string.Format("user: {0}, trns: {1}\n\tMessage: {2}\n\t\tTrace: {3}",
userId, transactionId, ex.Message, ex.StackTrace));
throw;
}
}
int DoSomething2(int orgId) {
try {
/* ... some stuff .... */
} catch(Exception ex) {
throw new MyException { Message = string.Format("org: {0}", orgId),
InnerException = ex };
}
}
Il tuo front-end non dovrebbe scaricare le tracce dello stack per gli utenti, quindi se l'eccezione arriva così lontano, devi gestirlo in un modo o nell'altro. Ma questo dipende da cosa è il front-end. Se si tratta di un servizio web, i codici di errore sono molto belli invece di fingere ingannevolmente che tutto è andato a buon fine, o non dare loro alcun feedback.