Condividi tramite


Rilevazione e generazione di tipi di eccezioni standard

Nelle seguenti linee guida vengono descritte le procedure consigliate per alcune delle eccezioni più comuni disponibili in .NET Framework.

Exception e SystemException

Non generare System.Exception o System.SystemException.

Non rilevare System.Exception o System.SystemException nel codice del framework, a meno che non si intenda rigenerare l'eccezione.

Evitare di rilevare System.Exception o System.SystemException, tranne nei gestori eccezioni di primo livello.

ApplicationException

Dedurre le eccezioni personalizzate dalla classe T:System.Exception anziché dalla classe T:System.ApplicationException.

L'idea iniziale di far derivare le eccezioni personalizzate dalla classe ApplicationException non ha prodotto alcun valore significativo in termini pratici. Per ulteriori informazioni, vedere Suggerimenti per gestire le eccezioni.

InvalidOperationException

Generare un'eccezione System.InvalidOperationException se si verifica uno stato inappropriato. System.InvalidOperationException deve essere generata se un insieme di proprietà o una chiamata di metodo non risulta appropriata rispetto allo stato corrente dell'oggetto. La scrittura su un oggetto System.IO.FileStream che è stato aperto in lettura ad esempio deve generare un'eccezione System.InvalidOperationException.

Questa eccezione deve essere generata anche quando lo stato combinato di un insieme di oggetti correlati non è valido per l'operazione.

ArgumentException, ArgumentNullException e ArgumentOutOfRangeException

Generare l'eccezione System.ArgumentException o uno dei relativi sottotipi se a un membro vengono passati argomenti non corretti. Preferire il tipo di eccezione maggiormente derivato, se possibile.

Nel codice riportato di seguito viene illustrato un esempio di generazione di un'eccezione quando un argomento è null (Nothing in Visual Basic).

If (anObject = Nothing) Then
    Throw New ArgumentNullException("anObject", "Specify a non-null argument.")
End If
if (anObject == null)
{
    throw new ArgumentNullException("anObject",
        "Specify a non-null argument.");
}
if (anObject == nullptr)
{
    throw gcnew ArgumentNullException("anObject",
        "Specify a non-null argument.");
}

Quando si genera l'eccezione System.ArgumentException o uno dei relativi tipi derivati, impostare la proprietà System.ArgumentException.ParamName. In questa proprietà è definito il nome del parametro che ha causato la generazione dell'eccezione. La proprietà può essere impostata utilizzando uno degli overload del costruttore.

Utilizzare value per il nome del parametro di valore implicito dei metodi per l'impostazione della proprietà.

Nell'esempio di codice riportato di seguito viene illustrata una proprietà che genera un'eccezione se viene passato un argomento null al chiamante.

Public Property Address() As IPAddress
    Get
        Return IPaddr
    End Get
    Set(ByVal value As IPAddress)
        If IsNothing(value) Then
            Throw New ArgumentNullException("value")
        End If
        IPaddr = value
    End Set
End Property
public IPAddress Address
{
    get
    {
        return address;
    }
    set
    {
        if(value == null)
        {
            throw new ArgumentNullException("value");
        }
        address = value;
    }
}
property IPAddress^ Address
{
    IPAddress^ get()
    {
        return address;
    }
    void set(IPAddress^ value)
    {
        if (value == nullptr)
        {
            throw gcnew ArgumentNullException("value");
        }
        address = value;
    }
}

Non consentire ad API che possono essere chiamate pubblicamente di generare in modo esplicito o implicito le eccezioni System.NullReferenceException, System.AccessViolationException, System.InvalidCastException o System.IndexOutOfRangeException. Eseguire la verifica degli argomenti per evitare che vengano generate queste eccezioni. La generazione di queste eccezioni determina l'esposizione dei dettagli di implementazione del metodo, che sono soggetti a variazioni nel tempo.

StackOverflowException

Non generare in modo esplicito System.StackOverflowException. Questa eccezione deve essere generata in modo esplicito esclusivamente da Common Language Runtime.

Non rilevare System.StackOverflowException.

È estremamente difficile gestire a livello di codice un overflow dello stack. Si consiglia di consentire questa eccezione per terminare il processo e utilizzare il debug per determinare l'origine del problema.

OutOfMemoryException

Non generare in modo esplicito System.OutOfMemoryException. Questa eccezione deve essere generata solo dall'infrastruttura CLR.

ComException e SEHException

Non generare in modo esplicito System.Runtime.InteropServices.COMException o System.Runtime.InteropServices.SEHException. Queste eccezioni devono essere generate solo dall'infrastruttura CLR.

Non rilevare System.Runtime.InteropServices.SEHException in modo esplicito.

ExecutionEngineException

Non generare System.ExecutionEngineException in modo esplicito.

Portions Copyright 2005 Microsoft Corporation. Tutti i diritti riservati.

Portions Copyright Addison-Wesley Corporation. Tutti i diritti riservati.

Per ulteriori informazioni sulle linee guida di progettazione, vedere “le linee guida di progettazione di Framework: Idiomi convenzioni, e modelli per libro raccolte riutilizzabili .NET„ di Krzysztof Cwalina e brad Abrams, emessi da Addison-Wesley, 2005.

Vedere anche

Concetti

Scelta del tipo corretto di eccezione da generare

Altre risorse

Linee guida di progettazione per lo sviluppo di librerie di classi

Linee guida di progettazione delle eccezioni