C# 为什么;掷骰子&引用;隐藏原始堆栈跟踪

C# 为什么;掷骰子&引用;隐藏原始堆栈跟踪,c#,C#,可能重复: 我想了解为什么“throw-ex”用法隐藏了原始堆栈跟踪?设计c#编译器时,幕后的基本原理是什么?这实际上不是一个c#问题,而是一个CLI设计问题,归结到不同的IL指令,以及 基本上,抛出ex(对于任何ex,甚至是原始的)是一个ILthrow,其中asthrow是一个ILrethrow 如果指定要抛出的特定异常,则该异常在逻辑上源自此方法。如果不是这样,那么: throw; 而不是抛出ex,或:将异常包装到另一个异常中,以便保留原始异常并显示新异常的来源: throw new S

可能重复:

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

这实际上不是一个c#问题,而是一个CLI设计问题,归结到不同的IL指令,以及

基本上,
抛出ex
(对于任何
ex
,甚至是原始的)是一个IL
throw
,其中as
throw
是一个IL
rethrow

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

throw;
而不是
抛出ex,或:将异常包装到另一个异常中,以便保留原始异常并显示新异常的来源:

throw new SomeException(ex);

在这种情况下,调用方可以通过
ex.InnerException

获取原始堆栈跟踪,当您捕获异常时,它的“出生地”在其他地方,并且异常在堆栈跟踪中一直携带到抛出它的地方。可以将其视为
throw
初始化
Exception
类实例的堆栈跟踪。所以
抛出ex
使用当前堆栈初始化
ex
的堆栈跟踪。

您是否知道可以使用
throw
如果您想重新抛出原始异常和原始堆栈跟踪?@codesparkle是的,我知道“抛出”的用法。但我只是想知道原因?在这种情况下,你实际上问的并不清楚。“为什么有一个命令会抛出一个新的堆栈跟踪”?因为设计师们认为这样一个东西足够有用,足以证明建造它的成本是合理的,所以这个问题到目前为止还没有完全重复stackoverflow.com上的任何其他问题。我知道投掷的最佳用法和区别;然后扔掉它;但我只想了解为什么c#architects会以这种方式设计。”
throw ex
是一种犯罪行为”,但它没有描述为什么它是犯罪行为。你对IL
throw
rethrow
的解释帮助我理解了。非常感谢。