Exception Filter

Eintrag zuletzt aktualisiert am: 19.10.2015

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 Lan-guage 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 können das "Rethrowing" von Laufzeitfehlern vermie-den werden, weil die zu behandelnden Fehler besser eingrenzt werden kön-nen. Das ist besonders sinnvoll bei den sehr allgemeinem Fehlertyp COMException, wo die eigentliche Ursache per ErrorCode() ausgelesen wer-den 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 aurfrufen, 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." [http://blogs.msdn.com/b/dotnet/archive/2009/08/25/the-good-and-the-bad-of-exception-filters.aspx].