Während es gängige Praxis ist, InnerException erneut auszulösen, um die zugrunde liegende Ausnahme an den Aufrufer zu übergeben, kann dies versehentlich wertvolle Stack-Trace-Informationen löschen und so die Debugging-Bemühungen behindern.
Wenn in C# eine Methode über Reflektion aufgerufen wird und eine Ausnahme auftritt, wird eine TargetInvocationException als Wrapper um die eigentliche Ausnahme geworfen. Um eine innere Ausnahme abzurufen, lösen Entwickler sie oft einfach erneut aus. Durch diesen Vorgang werden jedoch die Stack-Trace-Informationen gelöscht, die auf die wahre Fehlerquelle hinweisen.
Seit .NET 4.5 bietet die ExceptionDispatchInfo-Klasse eine Lösung für dieses Problem. Es ermöglicht das Abfangen und erneute Auslösen einer Ausnahme unter Beibehaltung des Stack-Trace. So verwenden Sie es:
<code class="language-csharp">using ExceptionDispatchInfo = System.Runtime.ExceptionServices.ExceptionDispatchInfo; try { // 执行可能抛出异常的方法。 task.Wait(); } catch (AggregateException ex) { // 捕获内部异常并使用原始堆栈跟踪重新抛出它。 ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); }</code>
Diese Methode ist besonders nützlich, wenn innere Ausnahmen aus einer AggregateException-Instanz entpackt werden, nachdem die C#-Sprachfunktion „await“ verwendet wurde. Es stellt sicher, dass Stack-Trace-Informationen während der asynchronen Programmierung nicht verloren gehen.
Das obige ist der detaillierte Inhalt vonWie kann ich Stack-Traces beim erneuten Auslösen von Ausnahmen in C# beibehalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!