Devo derivare eccezioni personalizzate da Exception o ApplicationException in .NET?

Qual è la procedura migliore durante la creazione delle classi di eccezioni in una soluzione .NET: per derivare da System.Exception o da System.ApplicationException ?

Secondo Jeffery Richter nel libro di linee guida per la progettazione di strutture:

System.ApplicationException è una class che non dovrebbe essere parte del framework .NET.

Era inteso per avere un significato nel senso che potevi potenzialmente “cogliere” tutte le eccezioni dell’applicazione, ma il modello non veniva seguito e quindi non ha valore.

È necessario derivare eccezioni personalizzate da System.Exception .

Anche MSDN ora dice di ignorare ApplicationException :

Se si sta progettando un’applicazione che deve creare le proprie eccezioni, si consiglia di derivare eccezioni personalizzate dalla class Exception. Inizialmente si pensava che le eccezioni personalizzate dovessero derivare dalla class ApplicationException; tuttavia, in pratica, questo non è stato trovato per aggiungere un valore significativo. Per ulteriori informazioni, vedere Best practice 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 .

Upshot: non usarlo. Deriva Exception .

Gli autori del framework considerano ApplicationException senza valore:

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 di quadri.

http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756

L’argomento del post sul blog è ulteriormente discusso lì.

rp

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 di codice C # che devo riparare.
  • Errore utente “normale” che non richiede correzione da parte mia.

So che non è consigliabile utilizzare ApplicationException, ma funziona benissimo poiché ci sono pochissime classi che non rispettano il pattern ApplicationException.