首页 >后端开发 >C++ >在 C# 中应如何重新引发异常以保留堆栈跟踪?

在 C# 中应如何重新引发异常以保留堆栈跟踪?

DDD
DDD原创
2025-01-23 19:06:40990浏览

How Should Exceptions Be Rethrown in C# to Preserve Stack Traces?

C#异常重新抛出最佳实践指南

在C#中处理异常时,选择合适的重新抛出方法来维护清晰的堆栈跟踪至关重要。

方法一:throw;

此语法重新抛出当前异常,同时保留其堆栈跟踪。

方法二:throw ex;

此方法重新抛出指定的Exception对象。但是,它会用throw语句的当前位置覆盖原始堆栈跟踪,从而难以查明异常的源头。

哪种方法更好?

重新抛出异常时,始终使用throw;throw ex;应被视为编码错误,因为它会掩盖有关异常来源的重要信息。

处理来自其他来源的异常

如果需要重新抛出源自其他地方的异常(例如,在AggregateException或TargetInvocationException中),请不要直接重新抛出它。相反,请使用ExceptionDispatchInfo来保留必要的信息。

例如:

<code class="language-csharp">try
{
    methodInfo.Invoke(...);
}
catch (System.Reflection.TargetInvocationException e)
{
    System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw();
    throw; // 确保编译器理解该代码块不会退出
}</code>

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

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