C'è una semplice regola: se non sai come gestire un'eccezione, non prenderla.
Rilevarlo e risintonizzare null o una lista vuota sarebbe la cosa peggiore che si possa fare perché sarà difficile eseguire il debug da dove proviene l'errore, o persino che si sia verificato un errore. Se lo fai avrai degli sviluppatori che tirano fuori i capelli.
Catturare un'eccezione e ridisegnarla come throw e;
è anche negativa perché si perde lo stack originale. Rethrowing utilizzando throw;
è OK a volte se si dispone di pulizia speciale è necessario fare solo se c'è un errore. Di solito questo non è il caso. Se si dispone di una pulizia da eseguire indipendentemente dal fatto che si sia verificato un errore, questo appartiene alla clausola finally.
Quindi, in generale, a meno che non ci sia qualcosa di sensato che è possibile fare per recuperare dall'errore, è sufficiente lasciare che l'eccezione si propaga al chiamante. Questo è il modo in cui le eccezioni sono progettate per funzionare.
Ci sono alcuni momenti in cui si potrebbe desiderare di prendere un'eccezione di aggiungere ulteriori informazioni (ad esempio per la registrazione), nel qual caso è necessario assicurarsi di utilizzare un InnerException
per evitare di perdere le informazioni originali:
try
{
foo(bar);
}
catch (Exception e)
{
throw new FooException("Foo failed for " + bar.ToString(), e);
}
ma in generale è meglio non farlo a meno che non si abbia una buona ragione. Ciò impedisce agli utenti di rilevare un tipo specifico di eccezione: cattureranno l'eccezione e quindi dovranno attivare il tipo di InnerException. Non è divertente. Lascia che il chiamante veda l'eccezione originale.
fonte
2009-12-29 11:09:12
Sembra che dovresti gestire questa eccezione solo nel livello di presentazione: le eccezioni dovrebbero essere eccezionali. Gestire le eccezioni solo se è possibile seguire un percorso logico diverso in base all'eccezione verificatasi. –