csharp / expert
Snippet
Bedingte Ausnahmefilterung
Ausnahmefilter (die 'when'-Klausel) sind dem Abfangen und erneuten Auslösen überlegen, da sie der Runtime ermöglichen, zu entscheiden, ob ein Catch-Block betreten wird, bevor der Stack abgebaut wird. Dies ist entscheidend für die Post-Mortem-Fehlersuche (z. B. Memory Dumps), da der Stacktrace am Ort des Fehlers intakt bleibt. Wenn der Filter 'false' zurückgibt, wird die Ausnahme weiter verbreitet, als wäre sie nie abgefangen worden.
snippet.cs
csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class GlobalErrorHandler{public static void ProcessData(Action action){try{action();}catch (Exception ex) when (LogAndContinue(ex)){// This block is never reached because LogAndContinue returns false}}private static bool LogAndContinue(Exception ex){Console.WriteLine($"Logging error: {ex.Message}");// Returning false tells the CLR to keep searching for a catch block// without unwinding the stack yet.return false;}}
Erklärung
1
catch (Exception ex) when (LogAndContinue(ex))
Führt die Filtermethode aus, um zu entscheiden, ob dieser Catch-Block die Ausnahme behandeln soll.
2
return false;
Durch die Rückgabe von 'false' protokollieren wir den Fehler, lassen die Ausnahme aber weiter aufsteigen, wobei der ursprüngliche Stack-Kontext erhalten bleibt.