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中文网其他相关文章!