作者:晓小墨_641 | 来源:互联网 | 2023-09-17 10:28
您应该始终使用以下语法重新引发异常。否则你会踩到堆栈跟踪:
throw;
如果您打印由 产生的跟踪throw ex
,您将看到它以该语句结束,而不是异常的真正来源。
基本上,使用throw ex
.
如果需要重新抛出来自其他地方(aggregateexception、TargetinvocationException)或可能来自另一个线程的异常,您也不应该直接重新抛出它。而是保留所有必要信息的ExceptionDispatchInfo
。
try
{
methodInfo.Invoke(...);
}
catch (System.Reflection.TargetinvocationException e)
{
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw();
throw; // just to inform the compiler that the flow never leaves the block
}