Gewusst wie: Verwenden spezifischer Ausnahmen in einem Catch-Block

Tritt eine Ausnahme auf, wird sie an den Stapel übergeben, und jeder catch-Block hat die Möglichkeit, sie zu behandeln. Wichtig ist die Reihenfolge der catch-Anweisungen. Setzen Sie catch-Blöcke, die auf spezifische Ausnahmen abzielen, vor diejenigen für allgemeine Ausnahmen. Ansonsten könnte der Compiler einen Fehler melden. Der richtige catch-Block wird durch Übereinstimmung des Ausnahmetyps mit dem Namen der im catch-Block angegebenen Ausnahme ermittelt. Gibt es keinen spezifischen catch-Block, wird die Ausnahme von einem allgemeinen catch-Block abgefangen, sofern ein solcher vorhanden ist.

Im folgenden Beispielcode wird ein try/catch-Block verwendet, um eine InvalidCastException abzufangen. Es wird eine Klasse namens Employee mit der Eigenschaft Emlevel (employee level) erstellt. Die Methode PromoteEmployee nimmt ein Objekt an und erhöht die Emlevel-Eigenschaft. Die InvalidCastException-Ausnahme tritt dann auf, wenn die DateTime-Instanz an die PromoteEmployee-Methode übergeben wird.

Beispiel

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

Durch die Common Language Runtime werden Ausnahmen abgefangen, die nicht durch einen catch-Block abgefangen wurden. Je nach Konfiguration der CLR wird entweder ein Dialogfeld zum Debuggen angezeigt oder das Programm wird beendet und ein Dialogfeld mit Ausnahmeinformationen angezeigt. Informationen zum Debuggen finden Sie unter Debuggen und Profilerstellung von Anwendungen.

Siehe auch

Aufgaben

Gewusst wie: Verwenden des Try-Catch-Blocks zum Abfangen von Ausnahmen

Gewusst wie: Explizites Auslösen von Ausnahmen

Gewusst wie: Erstellen benutzerdefinierter Ausnahmen

Gewusst wie: Verwenden von Finally-Blöcken

Konzepte

Exception-Klasse und Exception-Eigenschaften

Weitere Ressourcen

Grundlagen der Ausnahmebehandlung