Я понимаю значение ExceptionDispatchInfo.Capture(e).Throw()
(сохраняет исходную трассировку стека), но каково преимущество использования Capture
раннем этапе и передача ExceptionDispatchInfo
по сравнению с просто пропусканием Exception
?
В качестве конкретного примера, сравнивая
static Exception CaptureException(Action action)
{
try
{
action();
return null;
}
catch (Exception e)
{
return e;
}
}
public void Test1()
{
ExceptionDispatchInfo.Capture(CaptureException(
() => throw new IOException("Test")))
.Throw();
}
с
static ExceptionDispatchInfo CaptureDispatchInfo(Action action)
{
try
{
action();
return null;
}
catch (Exception e)
{
return ExceptionDispatchInfo.Capture(e);
}
}
public void Test2()
{
CaptureDispatchInfo(() => throw new IOException("Test")).Throw();
}
оба дают по существу одинаковые трассировки стека (это похоже на async
изменение этого.). Таким образом, я действительно не понимаю, почему класс ExceptionDispatchInfo
существует вообще, а не только комбинированный метод ExceptionDispatchInfo.Capture(e).Throw()
.