2010-02-04 21 views
47

In C# come definire le mie eccezioni?In C# come definire le mie eccezioni?

+5

Complimenti (ma non +1) per chiedere una domanda intelligibile con il minor numero possibile di parole. –

+0

Sono d'accordo con tutte le risposte di seguito, ma vorrei commentare che dovresti sempre ereditare direttamente da System.ApplicationException. La linea guida MS per questo è di distinguere immediatamente tra eccezioni di sistema e eccezioni definite dall'utente. Qualunque sia la tua scelta, scrivi la tua baseclass e mantieni coerente l'utilizzo delle eccezioni. –

+0

@Joel - Attento a ciò che dici. Il documento Microsoft Best Practices si contraddice per quanto riguarda le eccezioni personalizzate. Ho cambiato la mia risposta perché l'uso dell'OP sembra più orientato verso una ApplicationException. Controlla questo post sulle contraddizioni: http://weblogs.asp.net/erobillard/archive/2004/05/10/129134.aspx –

risposta

38

Sembra che ho iniziato un po 'di una battaglia eccezione sublcassing. In base alla guida Microsoft Best Practices che segui ... puoi ereditare da System.Exception o System.ApplicationException. C'è un post del blog buono (ma vecchio) che cerca di chiarire la confusione. Terrò il mio esempio con l'eccezione, per ora, ma si può leggere il post e ha scelto basandomi su quello che vi serve:

http://weblogs.asp.net/erobillard/archive/2004/05/10/129134.aspx

c'è una battaglia non di più! Grazie a Frederik per aver ricordato FxCop regola CA1058 in cui si afferma che i vostri eccezioni dovrebbero ereditare da System.Exception anziché System.ApplicationException:

CA1058: Types should not extend certain base types


Definire una nuova classe che eredita da Exception (ho incluso alcuni costruttori ... ma non deve averli):

using System; 
using System.Runtime.Serialization; 

[Serializable] 
public class MyException : Exception 
{ 
    // Constructors 
    public MyException(string message) 
     : base(message) 
    { } 

    // Ensure Exception is Serializable 
    protected MyException(SerializationInfo info, StreamingContext ctxt) 
     : base(info, ctxt) 
    { } 
} 

E altrove nel codice di gettare:

throw new MyException("My message here!"); 

EDIT

Aggiornato con le modifiche al fine di garantire un Exception Serializable. I dettagli possono essere trovati qui:

Winterdom Blog Archive - Make Exception Classes Serializable

Prestare particolare attenzione alla sezione sui passi che devono essere prese se si aggiungono proprietà personalizzate alla classe Exception.

Grazie a Igor per avermi chiamato!

+0

@Robin ... grazie per la modifica. Sono tornato dopo che mi sono reso conto di aver dimenticato di formattare come codice ed era già stato risolto. –

+2

@Justin Niessner: è necessario rendere serializzabile l'eccezione personalizzata se si desidera essere in grado di lanciarlo su AppDomains –

+1

Non è consigliabile ereditare da ApplicationException. Aumenta la gerarchia ereditaria senza una buona ragione. vedi http://blogs.msdn.com/brada/archive/2004/03/25/96251.aspx e http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx – Venr

11

Per definire:

public class SomeException : Exception 
{ 
    // Add your own constructors and properties here. 
} 

di buttare:

throw new SomeException(); 
+0

grazie !!!!!!!!!!!!!!! –

+0

Si potrebbe anche usare 'try' e' Catch SomeException(); '. Bump btw. –

2

Definizione:

public class CustomException : Exception 
{ 
    public CustomException(string Message) : base (Message) 
    { 
    } 
} 

lancio:

throw new CustomException("Custom exception message"); 
61

Linee guida per creare il proprio un'eccezione (accanto al fatto che la classe deve ereditare da eccezione)

  • assicurarsi che la classe è serializzabile, aggiungendo l'attributo [Serializable]
  • fornire i costruttori comuni che vengono utilizzati da eccezioni:

    MyException(); 
    
    MyException (string message); 
    
    MyException (string message, Exception innerException); 
    

Così, idealmente, la vostra abitudine Exception dovrebbe cercare almeno in questo modo:

[Serializable] 
public class MyException : Exception 
{ 
    public MyException() 
    {} 

    public MyException (string message) 
     : base(message) 
    {} 

    public MyException (string message, Exception innerException) 
     : base (message, innerException) 
    {}  
} 

A proposito del fatto se si dovrebbe ereditare da Exception o ApplicationException: FxCop ha una regola che dice che si dovrebbe evitare che eredita da ApplicationException:

CA1058: Microsoft.Design:
Modifica la base tipo di 'MyException' in modo che non estenda più 'ApplicationException'. Questo tipo di eccezione di base non fornisce alcun valore aggiuntivo per le classi di framework . Estendere "System.Exception" o un tipo di eccezione non sealed esistente . Non creare una nuova eccezione di base a meno che non vi sia un valore specifico nell'abilitare la creazione di un gestore di catch per un'intera classe di eccezioni.

Vedere the page on MSDN in merito a questa regola.

-3

È possibile definire la propria eccezione.

Le classi di eccezioni definite dall'utente derivano dalla classe ApplicationException.

È possibile visualizzare il seguente codice:

using System; 
namespace UserDefinedException 
{ 
    class TestTemperature 
    { 
     static void Main(string[] args) 
     { 
     Temperature temp = new Temperature(); 
     try 
     { 
      temp.showTemp(); 
     } 
     catch(TempIsZeroException e) 
     { 
      Console.WriteLine("TempIsZeroException: {0}", e.Message); 
     } 
     Console.ReadKey(); 
     } 
    } 
} 
public class TempIsZeroException: ApplicationException 
{ 
    public TempIsZeroException(string message): base(message) 
    { 
    } 
} 
public class Temperature 
{ 
    int temperature = 0; 
    public void showTemp() 
    { 
     if(temperature == 0) 
     { 
     throw (new TempIsZeroException("Zero Temperature found")); 
     } 
     else 
     { 
     Console.WriteLine("Temperature: {0}", temperature); 
     } 
    } 
} 

e per un'eccezione,

si può buttare un oggetto se è direttamente o indirettamente derivato dalla classe System.Exception

Catch(Exception e) 
{ 
    ... 
    Throw e 
} 
+0

Downvoted come raccomandato per sottoclasse Exception (not ApplicationException) dal .Net 2.0. È anche chiaramente indicato nelle altre risposte a questa stessa domanda. – Andy

Problemi correlati