可能重复:
What is the proper way to re-throw an exception in C#?
我想理解为什么“throw ex”用法会隐藏原始堆栈跟踪?在设计c#编译器时,幕后的基本理念是什么?
答案 0 :(得分:11)
这实际上不是一个C#问题,而是一个CLI设计问题,并归结为不同的IL指令,throw
和rethrow
。
基本上,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
的堆栈跟踪。