Condividi tramite


try-catch (Riferimenti per C#)

L'istruzione try-catch è costituita da un blocco try seguito da una o più clausole catch che specificano gestori per diverse eccezioni.

Note

Il blocco try contiene il codice controllato che può generare l'eccezione. Il blocco viene eseguito fino a quando non viene generata un'eccezione o fino al corretto completamento dell'esecuzione. Ad esempio, il tentativo riportato di seguito di eseguire il cast di un oggetto null genera l'eccezione NullReferenceException:

object o2 = null;
try
{
    int i2 = (int)o2;   // Error
}

Se utilizzata senza argomenti, la clausola catch intercetta qualsiasi tipo di eccezione e può essere considerata come clausola catch generica. Può anche accettare un argomento di oggetto derivato da System.Exception, in questo caso gestirà un'eccezione specifica. Di seguito è riportato un esempio:

catch (InvalidCastException e) 
{
}

È possibile utilizzare più di una clausola catch specifica nella stessa istruzione try-catch. In questo caso, l'ordine delle clausole catch è importante poiché le clausole catch vengono esaminate nell'ordine specificato. Vengono intercettate prima le eccezioni più specifiche, quindi quelle meno specifiche.

Un'istruzione throw può essere utilizzata nel blocco catch per rigenerare l'eccezione che è stata intercettata dall'istruzione catch. Di seguito è riportato un esempio:

catch (InvalidCastException e) 
{
    throw (e);    // Rethrowing exception e
}

Se si desidera rigenerare l'eccezione correntemente gestita da una clausola catch senza parametri, utilizzare l'istruzione throw senza argomenti. Di seguito è riportato un esempio:

catch
{
    throw;
}

All'interno di un blocco try inizializzare solo le variabili dichiarate in questo ambito; in caso contrario può verificarsi un'eccezione prima del completamento dell'esecuzione del blocco. Nell'esempio di codice riportato di seguito la variabile x viene inizializzata all'interno del blocco try. Un tentativo di utilizzare questa variabile all'esterno del blocco try nell'istruzione Write(x) genererà l'errore del compilatore: Utilizzo della variabile locale non assegnata.

static void Main() 
{
    int x;
    try 
    {
        // Don't initialize this variable here.
        x = 123;
    }
    catch
    {
    }
    // Error: Use of unassigned local variable 'x'.
    Console.Write(x);
}

Per ulteriori informazioni su catch, vedere try-catch-finally.

Esempio

Nell'esempio riportato di seguito il blocco try contiene una chiamata al metodo MyMethod() che potrebbe causare un'eccezione. La clausola catch contiene il gestore eccezioni che visualizza semplicemente un messaggio sullo schermo. Quando l'istruzione throw viene chiamata dall'interno di MyMethod, il sistema cerca l'istruzione catch e visualizza il messaggio Exception caught.

// try_catch_example.cs
using System;
class MainClass
{
    static void ProcessString(string s)
    {
        if (s == null)
        {
            throw new ArgumentNullException();
        }
    }
    
    static void Main()
    {
        try
        {
            string s = null;
            ProcessString(s);
        }
        catch (Exception e)
        {
            Console.WriteLine("{0} Exception caught.", e);
        }
    }
}

Esempio di output

System.ArgumentNullException: Value cannot be null.
   at MainClass.Main() Exception caught.

In questo esempio vengono utilizzate due istruzioni catch. Viene intercettata l'eccezione più specifica, che è la prima nell'ordine.

// try_catch_ordering_catch_clauses.cs
using System;
class MainClass
{
    static void ProcessString(string s)
    {
        if (s == null)
        {
            throw new ArgumentNullException();
        }
    }

    static void Main()
    {
        try
        {
            string s = null;
            ProcessString(s);
        }
        // Most specific:
        catch (ArgumentNullException e)
        {
            Console.WriteLine("{0} First exception caught.", e);
        }
        // Least specific:
        catch (Exception e)
        {
            Console.WriteLine("{0} Second exception caught.", e);
        }
    }
}

Esempio di output

System.ArgumentNullException: Value cannot be null.
   at MainClass.Main() First exception caught.

Commenti

Nell'esempio precedente, se si inizia con la clausola catch meno specifica, verrà generato il seguente messaggio di errore: A previous catch clause already catches all exceptions of this or a super type ('System.Exception')

Per rilevare l'eccezione meno specifica, è necessario sostituire l'istruzione throw con l'istruzione seguente:

throw new Exception();

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le sezioni riportate di seguito in Specifiche del linguaggio C#:

  • 5.3.3.13 Istruzioni try-catch

  • 8.10 Istruzione try

  • 16 Eccezioni

Vedere anche

Attività

Procedura: generare eccezioni in modo esplicito

Riferimenti

Parole chiave di C#
The try, catch, and throw Statements
Istruzioni di gestione delle eccezioni (Riferimenti per C#)
throw (Riferimenti per C#)
try-finally (Riferimenti per C#)

Concetti

Guida per programmatori C#

Altre risorse

Riferimenti per C#