为什么"扔前"; 隐藏原始堆栈跟踪

mku*_*kus 6 c#

可能重复:
在C#中重新抛出异常的正确方法是什么?

我想了解为什么"throw ex"用法会隐藏原始堆栈跟踪?在设计c#编译器时,幕后的基本理念是什么?

Mar*_*ell 12

这实际上不是一个C#问题,而是一个CLI设计问题,并归结为不同的IL指令,throw以及rethrow.

基本上,throw ex;(对于任何ex,甚至是原始的)都是IL throw,其中 - 就像throw;IL一样rethrow.

如果要指定要抛出的特定异常,那么此异常在逻辑上源自此处,现在是此方法.如果不是这样,那么:

throw;
Run Code Online (Sandbox Code Playgroud)

而不是throw ex;,或:异常包装在另一个异常中,因此您保留原始异常显示新异常的来源:

throw new SomeException(ex);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,调用者可以通过获取原始堆栈跟踪ex.InnerException.