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

StackOverflow https://stackoverflow.com/questions/52753

  •  09-06-2019
  •  | 
  •  

Domanda

Qual è la procedura migliore quando si creano le classi di eccezioni in una soluzione .NET:Derivare da System.Exception o da System.ApplicationException?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top