Devo derivare eccezioni personalizzate da Exception o ApplicationException in .NET?
Domanda
Qual è la procedura migliore quando si creano le classi di eccezioni in una soluzione .NET:Derivare da System.Exception
o da System.ApplicationException
?
Soluzione
Secondo Jeffery Richter nel libro Linee guida per la progettazione del framework:
System.ApplicationException
è una classe che non dovrebbe far parte del framework .NET.
Doveva avere un significato in quanto potresti potenzialmente catturare "tutte" le eccezioni dell'applicazione, ma il modello non è stato seguito e quindi non ha valore.
Altri suggerimenti
Dovresti ricavare eccezioni personalizzate da System.Exception
.
Anche MSDN ora dice di ignorare ApplicationException
:
Se stai progettando un'applicazione che deve creare le proprie eccezioni, si consiglia di derivare eccezioni personalizzate dalla classe di eccezione.Inizialmente si pensava che le eccezioni personalizzate dovessero derivare dalla classe ApplicationException;Tuttavia, in pratica, ciò non è stato riscontrato che aggiunge un valore significativo.Per ulteriori informazioni, vedere Migliori pratiche per la gestione delle eccezioni.
http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx
ApplicationException
considerato inutile è un argomento forte e critico contro ApplicationException
.
Risultato:non usarlo.Derivano dalla Exception
.
Gli stessi autori del framework considerano ApplicationException inutile:
http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx
con un bel seguito qui:
http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx
In caso di dubbio, seguo il loro libro Linee guida per la progettazione del framework.
http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756
L'argomento del post del blog viene ulteriormente discusso lì.
p.p
Sono abituato a fare:
private void buttonFoo_Click()
{
try
{
foo();
}
catch(ApplicationException ex)
{
Log.UserWarning(ex);
MessageVox.Show(ex.Message);
}
catch(Exception ex)
{
Log.CodeError(ex);
MessageBox.Show("Internal error.");
}
}
Permette di fare la differenza tra:
- Errore di sistema del codice C# che devo riparare.
- Errore utente "normale" che non necessita di correzione da parte mia.
So che non è consigliabile utilizzare ApplicationException, ma funziona benissimo poiché esiste pochissime classi che non rispettano il pattern ApplicationException.