小编典典

在 C# 中重新引发异常的正确方法是什么?

all

这样做更好吗:

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw;
}

或这个:

try
{
    ...
}
catch (Exception ex)
{
    ...
    throw ex;
}

他们做同样的事情吗?这个比那个好吗?


阅读 106

收藏
2022-03-13

共1个答案

小编典典

您应该始终使用以下语法重新引发异常。否则你会踩到堆栈跟踪:

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
}
2022-03-13