handling - c# exception raise



In C#come definire le mie eccezioni? (4)

È possibile definire la propria eccezione.

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

Puoi vedere 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 aver lanciato un'eccezione,

È possibile lanciare un oggetto se è derivato direttamente o indirettamente dalla classe System.Exception

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

In C # come definire le mie eccezioni?


Answer #1

Definire:

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

Gettare:

throw new SomeException();

Answer #2

Linee guida per la creazione di una propria eccezione (accanto al fatto che la classe dovrebbe ereditare dall'eccezione)

  • assicurati che la classe sia serializzabile, aggiungendo l'attributo [Serializable]
  • fornire i costruttori comuni utilizzati dalle eccezioni:

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

Quindi, idealmente, la tua Exception personalizzata dovrebbe apparire 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)
    {}    
}

Informazioni sul fatto che si debba ereditare da Exception o ApplicationException : FxCop ha una regola che dice che si dovrebbe evitare di ereditare da ApplicationException :

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

Vedi la pagina su MSDN riguardo questa regola.


Answer #3

Sembra che io abbia iniziato un po 'di una battaglia di sublocazione di eccezioni. 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. Per ora conserverò il mio esempio con Exception, ma puoi leggere il post e scegliere in base a ciò di cui hai bisogno:

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

Non c'è più una battaglia! Grazie a Frederik per aver segnalato la regola FxCop CA1058 che afferma che le eccezioni dovrebbero ereditare da System.Exception piuttosto che System.ApplicationException:

CA1058: i tipi non dovrebbero estendere determinati tipi di base

Definisci una nuova classe che eredita da Exception (ho incluso alcuni costruttori ... ma non devi 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 tuo codice da buttare:

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

MODIFICARE

Aggiornato con le modifiche per garantire un'eccezione serializzabile. I dettagli possono essere trovati qui:

Winterdom Blog Archive - Rendi serializzabili le classi di eccezioni

Prestare particolare attenzione alla sezione relativa ai passaggi da eseguire se si aggiungono proprietà personalizzate alla classe Exception.

Grazie a Igor per avermi chiamato!





exception