Advanced Services | Eigene Exceptionklassen |
Es ist sehr einfach eigene Ausnahmeklassen zu schreiben. Einzige Bedingung: Eine eigene Ausnahmeklasse muß immer eine Unterklasse von Exception sein. Sie kann auch eine Unterklasse von SystemException sein. Das ist eher eine Bezeichnungsfrage. Ein Unterschied besteht in der Standardmeldung, wenn man im Konstruktor keine eigene Fehlermeldung übergibt. Leitet man von Exception ab, so lautet die Defaultmessage "Eine Ausnahme vom Typ CustomException.MyException wurde ausgelöst." Leitet man von SystemException ab, so lautet sie schlicht "Systemfehler". Beide Klassen haben dieselben Konstruktoren, dieselben Methoden und dieselben Properties. Alle Exceptions verfügen über vier Konstruktoren, von denen man in einer Unterklasse meist nur den Defaultkonstruktor und den Konstruktor implementiert, der einen String bekommt, mit dem die Property Message gesetzt wird. Meist wird eine Exceptionklasse dann geschrieben, wenn man keinen passenden Namen für den bei einer Methode auftretenden Fehler findet. Das folgende Beispiel zeigt das Vorgehen.
using System; namespace CustomException { class CustomException { static void Main(string[] args) { try { Foo folle = new Foo(); folle.FooFoo(); } catch (Exception ex) { Console.WriteLine("Error message: " + ex.Message); } } } class Foo { public void FooFoo() { throw new MyException(); } } class MyException : Exception { public MyException() : base() {} public MyException(string msg) : base(msg) { } // diese Konstruktoren braucht man seltener public MyException(string msg, Exception inner) : base(msg, inner) { } public MyException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext ctx) : base(info, ctx) { } } }
Mehr ist nicht zu tun. Meist reicht es auch, nur die beiden ersten Konstruktoren zu schreiben. Will man eine spezifische zur eigenen Fehlerklasse passende Meldung anzeigen, so wird man beim Erzeugen des Objekts den zweiten Konstruktor verwenden. Die Property Message liefert dann die übergebene Meldung. Die eigene Klasse kann man nun mit try-catch und/oder throw verwenden.