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
Referenz
Ausnahmen und Ausnahmebehandlung (C#-Programmierhandbuch)