Was ist Exception Filter ?

Mit einem Exception Filter kann man zusätzlich zu den Exception-Klassen in den catch-Blöcken weiter zwischen verschiedenen Fällen differenzieren. Unterstützung für Exception Filter gibt es seit .NET 1.0 in der Common Language Runtime (CLR). Aber zunächst haben nur Visual Basic .NET und F# diese Möglichkeit in der Sprachsyntax auch angeboten. Erst mit C# 6.0 ist dieses syntaktische Zuckerstück auch in die C#-Sprachsyntax eingezogen. Man verwendet dazu das Schlüsselwort when.

try
{
var datei = System.IO.File.ReadLines(filename);
}
catch (ArgumentException) when (filename == "")
{
Console.WriteLine("Ohne Dateiname macht diese Aktion keinen Sinn!");
}
catch (ArgumentException ex) when (ex.Message.Contains("Illegales"))
{
Console.WriteLine("Ungültige Zeichen im Dateinamen: " + filena-me);
}
catch (ArgumentException ex)
{
Console.WriteLine("Ungültige Angabe: " + filename + ":" + ex.Message);
}
catch (NotSupportedException ex) when (ex.Message.Contains("format"))
{
Console.WriteLine("Ungültiges Format!");
}
catch (NotSupportedException ex)
{
Console.WriteLine("Nicht unterstützt: " + ex.Message);
}
catch (FileNotFoundException ex)
{
Console.WriteLine("Datei " + filename + " nicht gefunden");
}
catch (Exception ex)
{
Console.WriteLine("Anderer Fehler: " + ex.Message);
}

"Rethrowing" vermeiden

Mit Exception Filter kann das "Rethrowing" von Laufzeitfehlern vermieden werden, weil die zu behandelnden Fehler besser eingegrenzt werden können. Das ist besonders sinnvoll bei dem sehr allgemeinen Fehlertyp COMException, wo die eigentliche Ursache per ErrorCode() ausgelesen werden muss.

Alt mit "Rethrowing":
try
{
RessourcenZugriff();
}
catch (System.Runtime.InteropServices.COMException ex)
{
if ((uint)ex.ErrorCode != 0x80070005) throw ex;
Console.WriteLine("Zugang verboten!");
}


Neu mit Exception Filter:
try
{
RessourcenZugriff();
}
catch (System.Runtime.InteropServices.COMException ex) when ((uint)ex.ErrorCode == 0x80070005)
{
Console.WriteLine("Zugang verboten!");
}

Exception Filter mit Bedacht einsetzen

Um die Übersichtlichkeit des Programmcodes zu bewahren und Seiteneffekte zu vermeiden, sollte man in Exception Filtern kann weiteren Methoden aufrufen, die weitere Aktionen auslösen. Mike Magruder aus dem CLR-Team empfiehlt: "To keep your world safe and simple try to limit yourself to expressions that only access the exception object, and don’t modify anything." [blogs.msdn.com/b/dotnet/archive/2009/08/25/the-good-and-the-bad-of-exception-filters.aspx].

Beratung & Support

Schulungen

Anfrage für eine individuelle Schulung zum Thema EXCEPTION FILTER Gesamter Schulungsthemenkatalog

Fachbücher

Alle unsere aktuellen Fachbücher E-Book-Abo für ab 99 Euro im Jahr