Share via


Ausnahmen (C# und Java im Vergleich)

Aktualisiert: November 2007

Die Ausnahmebehandlung in C# unterscheidet sich kaum von der Ausnahmebehandlung in Java.

Wenn bei der Ausführung eines Programms ein kritischer Fehler auftritt, wird von der .NET Framework-Common Language Runtime (CLR) ein Exception-Objekt erstellt, anhand dessen der Fehler genau spezifiziert wird. In .NET Framework ist Exception die Basisklasse für alle Ausnahmeklassen. Es gibt zwei Kategorien von Ausnahmen, die sich von der Exception-Klasse ableiten: SystemException und ApplicationException. Alle Typen im System-Namespace leiten sich von SystemException ab. Benutzerdefinierte Ausnahmen leiten sich in der Regel von ApplicationException ab, damit zwischen Laufzeit- und Anwendungsfehlern unterschieden werden kann. Zu den gängigen System-Ausnahmen gehören:

  • IndexOutOfRangeException: Es wird ein Index verwendet, der die Größe des Arrays oder der Auflistung übersteigt.

  • NullReferenceException: Die Eigenschaft oder Methode eines Verweises wurde verwendet, bevor dieser Verweis auf eine gültige Instanz festgelegt wurde.

  • ArithmeticException: Eine Operation führt zu einem Überlauf oder Unterlauf.

  • FormatException: Ein Argument oder ein Operand hat ein falsches Format.

Wie in Java fügen Sie Code, der eine Ausnahme auslösen kann, in einen try -Block ein. Ein oder mehrere nachfolgende catch-Blöcke übernehmen die Fehlerbehandlung. Sie können auch einen finally-Block für Code verwenden, den Sie unabhängig von einer Ausnahme ausführen möchten. Weitere Informationen finden Sie unter try-catch (C#-Referenz) und try-catch-finally (C#-Referenz).

Wenn Sie mehrere catch-Blöcke verwenden, müssen die abgefangenen Ausnahmen ihrer Spezialität nach absteigend angeordnet werden, da nur der erste mit der ausgelösten Ausnahme übereinstimmende catch-Block ausgeführt wird. Der C#-Compiler setzt dies durch, der Java-Compiler nicht.

Außerdem ist in C# im Unterschied zu Java für den catch-Block kein Argument erforderlich. Wenn kein Argument angegeben ist, gilt der catch-Block für alle Exception-Klassen.

Wenn Sie z. B. eine Datei lesen, kann es zu einer FileNotFoundException oder einer IOException kommen. In diesem Fall fügen Sie den spezielleren FileNotFoundException-Handler als ersten ein:

try
{
    // code to open and read a file
}
catch (System.IO.FileNotFoundException e)
{
    // handle the file not found exception first
}
catch (System.IO.IOException e)
{
    // handle any other IO exceptions second
}
catch
{
    // a catch block without a parameter
    // handle all other exceptions last
}
finally
{
    // this is executed whether or not an exception occurs
    // use to release any external resources
}

Sie können Ihre eigenen Ausnahmeklassen erstellen, indem Sie diese von Exception ableiten. So wird z. B. im folgenden Code eine InvalidDepartmentException-Klasse erstellt, die Sie auslösen können, wenn beispielsweise die angegebene Abteilung für einen neuen Employee ungültig ist. Der Klassenkonstruktor für die benutzerdefinierte Ausnahme ruft den Basisklassenkonstruktor mithilfe des base-Schlüsselworts auf und sendet eine entsprechende Meldung:

public class InvalidDepartmentException : System.Exception
{
    public InvalidDepartmentException(string department) : base("Invalid Department: " + department)
    {
    }
}

Mit dem folgenden Code könnten Sie dann die Ausnahme auslösen:

class Employee
{
    private string department;

    public Employee(string department)
    {
        if (department == "Sales" || department == "Marketing")
        {
            this.department = department;
        }
        else
        {
            throw new InvalidDepartmentException(department);
        }
    }
}

C# unterstützt keine überprüften Ausnahmen. In Java werden die überprüften Ausnahmen mit dem throws-Schlüsselwort deklariert. So wird angegeben, dass eine Methode einen bestimmten Ausnahmetyp auslösen kann, der vom aufrufenden Code behandelt werden muss.

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Ausnahmen und Ausnahmebehandlung (C#-Programmierhandbuch)

Weitere Ressourcen

Die Programmiersprache C# für Java-Entwickler