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

时间:2012-08-13 09:24:44

标签: c#

  

可能重复:
  What is the proper way to re-throw an exception in C#?

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

2 个答案:

答案 0 :(得分:11)

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

基本上,throw ex;(对于任何ex,甚至是原始版本)都是IL throw,其中throw;是IL rethrow。< / p>

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

throw;

而不是throw ex;,或者: 换行 另一个异常中的异常,因此您保留原始异常显示在哪里新的来自:

throw new SomeException(ex);

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

答案 1 :(得分:1)

当你发现一个例外时,它的出生地就是#34;在其他地方,异常在堆栈跟踪中进行到它被抛出的地方。考虑一下throw初始化Exception类实例的堆栈跟踪。因此throw ex;使用当前堆栈初始化ex的堆栈跟踪。