Condividi tramite


Come usare eccezioni specifiche in un blocco catch

In generale, è buona prassi di programmazione intercettare un tipo specifico di eccezione piuttosto che usare un'istruzione di base catch.

Quando si verifica un'eccezione, viene propagata lungo lo stack e a ogni blocco catch viene data la possibilità di gestirla. L'ordine delle istruzioni catch è importante. Inserire blocchi catch destinati a eccezioni specifiche prima di un blocco catch di eccezioni generale o il compilatore potrebbe generare un errore. Il blocco catch appropriato è determinato dalla corrispondenza del tipo dell'eccezione al nome dell'eccezione specificata nel blocco catch. Se non è presente alcun blocco catch specifico, l'eccezione viene intercettata da un blocco catch generale, se presente.

Nell'esempio di codice seguente viene usato un blocco try/catch per intercettare un InvalidCastException. L'esempio crea una classe denominata Employee con una singola proprietà, livello dipendente (Emlevel). Un metodo, PromoteEmployee, accetta un oggetto e incrementa il livello del dipendente. Si verifica un InvalidCastException quando un'istanza DateTime viene passata al metodo PromoteEmployee.

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.
        var e = (Employee) emp;
        // Increment employee level.
        e.Emlevel = e.Emlevel + 1;
    }

    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);
        }
    }
}
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

Vedere anche