可能重复:
如何在C#中正确地重新抛出异常?
我想了解为什么使用“throw ex”会隐藏原始堆栈跟踪?在设计C#编译器时背后的基本哲学是什么?
throw
和rethrow
有关。throw ex;
(对于任何ex
,甚至包括原始异常)是一个IL throw
,而throw;
则是一个IL rethrow
。throw;
不要使用throw ex;
,而应该包装异常到另一个异常中,这样可以保留原始异常并且显示新异常的来源:
throw new SomeException(ex);
如果情况允许,调用者可以通过 ex.InnerException
获取原始的堆栈跟踪。
throw
初始化了Exception
类实例的堆栈跟踪。因此,throw ex;
使用当前堆栈初始化了ex
的堆栈跟踪。
throw;
命令? - Adam