AggregateException - что представляет собой AggregateException.Flatten (). InnerException?

17

Я искал какой-то код в одном из наших приложений, который выглядит следующим образом:

catch (AggregateException ae)
{
    this._logger.Log(ae.Flatten().InnerException.ToString(), Category.Exception, Priority.High);
}

Мой вопрос в том, что. Я знаю, что AggregateException.Flatten() делает, и я знаю, что AggregateException.Flatten().InnerExceptions представляет. Однако, что означает AggregateException.Flatten().InnerException (одиночный)?

    
задан Randy Minder 26.11.2012 в 19:23
источник

1 ответ

35

В исходном исключении будет только one не-Агрегатных Исключений. Например, если у вас есть начальный AggregateException of:

AggregateException
    AggregateException
        IOException("x")
        IOException("y")
    IOException("z")

Тогда InnerException сглаженного результата выйдет как IOException("x") , IOException("y") или IOException("z") . Я не верю, что есть какие-либо гарантии относительно , который был бы. (Я считаю, что текущее поведение дало бы «z» версию на данный момент ...) Это будет первый из InnerExceptions на сплющенной версии, но это должно рассматриваться как union всех исходных неагрегатных исключений без гарантированного порядка.

В основном InnerException не очень полезно для AggregateException . Было бы гораздо более полезно записывать all InnerExceptions ... или просто вызывать ToString() в исключении верхнего уровня, которое сохранит всю структуру ...

    
ответ дан Jon Skeet 26.11.2012 в 19:27