Procedura: utilizzare eccezioni specifiche in un blocco catch

Quando si verifica un'eccezione, essa viene passata verso i livelli superiori dello stack e ciascun blocco catch ha l'opportunità di gestirla. L'ordine delle istruzioni catch è importante. Inserire i blocchi catch destinati a eccezioni specifiche prima di un blocco catch relativo a eccezioni generiche, poiché in caso contrario è possibile che venga generato un errore in fase di compilazione. Nella determinazione del blocco catch adatto viene considerato il tipo dell'eccezione, che deve corrispondere al nome dell'eccezione specificata nel blocco catch. Se non esiste alcun blocco catch specifico, l'eccezione verrà intercettata da un blocco catch generico, se ne è presente uno.

Nell'esempio di codice seguente viene utilizzato un blocco try/catch per intercettare un'eccezione InvalidCastException. Nell'esempio viene creata una classe denominata Employee con una singola proprietà, relativa al livello dell'impiegato (Emlevel). Un metodo, PromoteEmployee, richiede la specifica di un oggetto e incrementa il livello dell'impiegato. Quando al metodo PromoteEmployee viene passata un'istanza di DateTime, si verifica un'eccezione InvalidCastException.

Esempio

Imports System

Public Class Employee
    'Create employee level property.
    Public Property Emlevel As Integer
        Get
            Return emlevelValue
        End Get
        Set
            emlevelValue = Value
        End Set
    End Property

    Private emlevelValue As Integer = 0
End Class

Public Class Ex13
    Public Shared Sub PromoteEmployee(emp As Object)
        'Cast object to Employee.
        Dim e As Employee = CType(emp, Employee)
        ' Increment employee level.
        e.Emlevel = e.Emlevel + 1
    End Sub

    Public Shared Sub Main()
        Try
            Dim o As Object = New Employee()
            Dim newyears As New DateTime(2001, 1, 1)
            'Promote the new employee.
            PromoteEmployee(o)
            'Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
            PromoteEmployee(newyears)
        Catch e As InvalidCastException
            Console.WriteLine("Error passing data to PromoteEmployee method. " + e.Message)
        End Try
    End Sub
End Class
using System;

public class Employee
{
    //Create employee level property.
    public int Emlevel
    {
        get
        {
            return(emlevel);
        }
        set
        {
            emlevel = value;
        }
    }

    private int emlevel = 0;
}

public class Ex13
{
    public static void PromoteEmployee(Object emp)
    {
        //Cast object to Employee.
        Employee e = (Employee) emp;
        // Increment employee level.
        e.Emlevel = e.Emlevel + 1;
    }

    public static void Main()
    {
        try
        {
            Object o = new Employee();
            DateTime newyears = new DateTime(2001, 1, 1);
            //Promote the new employee.
            PromoteEmployee(o);
            //Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
            PromoteEmployee(newyears);
        }
        catch (InvalidCastException e)
        {
            Console.WriteLine("Error passing data to PromoteEmployee method. " + e.Message);
        }
    }
}
using namespace System;

public ref class Employee
{
public:
    Employee()
    {
        emlevel = 0;
    }

    //Create employee level property.
    property int Emlevel
    {
        int get()
        {
            return emlevel;
        }
        void set(int value)
        {
            emlevel = value;
        }
    }

private:
    int emlevel;
};

public ref class Ex13
{
public:
    static void PromoteEmployee(Object^ emp)
    {
        //Cast object to Employee.
        Employee^ e = (Employee^) emp;
        // Increment employee level.
        e->Emlevel++;
    }

    static void Main()
    {
        try
        {
            Object^ o = gcnew Employee();
            DateTime^ newyears = gcnew DateTime(2001, 1, 1);
            //Promote the new employee.
            PromoteEmployee(o);
            //Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
            PromoteEmployee(newyears);
        }
        catch (InvalidCastException^ e)
        {
            Console::WriteLine("Error passing data to PromoteEmployee method. " + e->Message);
        }
    }
};

int main()
{
    Ex13::Main();
}

Le eccezioni che non vengono intercettate da un blocco catch vengono intercettate nel Common Language Runtime. A seconda della configurazione del runtime viene visualizzata una finestra di dialogo di debug oppure viene interrotta l'esecuzione del programma e viene visualizzata una finestra di dialogo contenente informazioni sull'eccezione. Per informazioni sul debug, vedere Debug e profiling di applicazioni.

Vedere anche

Attività

Procedura: utilizzare il blocco try/catch per l'intercettazione di eccezioni

Procedura: generare eccezioni in modo esplicito

Procedura: creare eccezioni definite dall'utente

Procedura: utilizzare blocchi Finally

Concetti

Classe e proprietà dell'eccezione

Altre risorse

Nozioni fondamentali sulla gestione delle eccezioni