可能重复: What is the proper way to re-throw an exception in C#?
我想知道为什么“抛出前”用法隐藏了原始堆栈跟踪?在设计c#编译器时,场景背后的基本理念是什么?
发布于 2012-08-13 09:28:17
这实际上不是一个C#问题,而是一个CLI设计问题,可以归结为不同的IL指令,throw
和rethrow
。
基本上,throw ex;
(对于任何ex
,甚至是原始ex
)都是IL throw
,其中throw;
是IL rethrow
。
如果要指定要抛出的特定异常,则此异常在逻辑上是从这里开始的,现在是此方法。如果不是这样的话,那么也可以:
throw;
而不是throw ex;
,或:将异常包装在另一个异常中,因此保留原始异常并显示新异常的来源:
throw new SomeException(ex);
在这种情况下,调用方可以通过ex.InnerException
获得原始堆栈跟踪。
发布于 2012-08-13 09:29:00
当您捕获一个异常时,它的“出生地”在其他地方,异常在堆栈中进行跟踪,直到抛出的位置。考虑一下,当throw
初始化Exception
类实例的堆栈跟踪时。因此,throw ex;
用当前堆栈初始化ex
的堆栈跟踪。
https://stackoverflow.com/questions/11931432
复制相似问题