首页 >后端开发 >C++ >如何在保留原始堆栈跟踪的同时重新抛出 C# 中的内部异常?

如何在保留原始堆栈跟踪的同时重新抛出 C# 中的内部异常?

Patricia Arquette
Patricia Arquette原创
2025-01-17 07:11:09643浏览

How Can I Rethrow Inner Exceptions in C# While Preserving the Original Stack Trace?

在C#中重新抛出内部异常时保留堆栈跟踪

通过反射调用方法时,异常会被包装在TargetInvocationException中。为了将底层异常传递给调用者同时保留其堆栈跟踪,重新抛出InnerException是一种常见方法。但是,此方法会无意中擦除原始堆栈跟踪。

针对.NET 4.5及以上版本的解决方案

在.NET 4.5中引入了ExceptionDispatchInfo,为这个问题提供了解决方案。通过捕获异常然后重新抛出它,堆栈跟踪将保持不变:

<code class="language-csharp">using ExceptionDispatchInfo =
    System.Runtime.ExceptionServices.ExceptionDispatchInfo;

try
{
    // 可能引发异常的代码
}
catch (Exception ex)
{
    ExceptionDispatchInfo.Capture(ex).Throw();
}</code>

此方法适用于任何类型的异常,而不仅仅是AggregateException。

ExceptionDispatchInfo的优势

ExceptionDispatchInfo具有以下几个优点:

  • 保留原始堆栈跟踪,在调试过程中提供有价值的信息。
  • 支持其他异常包装器,例如AggregateException。
  • 简化异步编程场景中异常的处理。

以上是如何在保留原始堆栈跟踪的同时重新抛出 C# 中的内部异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn