Является ли метод .ToString в исключении рекурсивным? - PullRequest
0 голосов
/ 01 марта 2012

Я работаю в довольно сложной среде, где иногда исключение real является внутренним исключением глубиной в несколько уровней ... поэтому я испытывал желание написать код, подобный этому:

Dim innerEx = ex.InnerException
While innerEx IsNot Nothing
  innerEx = innerEx.InnerException
End While

Однако, согласно документации MSDN , метод ToString вызывает ToString для своего InnerException ..., поскольку это исключение, могу ли я предположить, что это будет работать рекурсивно?

Ответы [ 2 ]

4 голосов
/ 01 марта 2012

Это будет работать полностью рекурсивно, если только крайнее исключение не решит переопределить ToString () без вызова базовой версии. Затем, конечно, метод возвращает то, что решит вернуть переопределенная версия. Поэтому разработчикам не рекомендуется переопределять ToString в своих собственных исключениях, чтобы сохранять поведение вызова ToString () для предсказуемого исключения.

Кстати, не имеет значение, если какое-либо из внутренних исключений переопределяет ToString (), потому что во время рекурсии открытый (виртуальный) метод ToString () не используется. Вместо этого вызывается закрытый метод ToString (bool), который выполняет всю работу и при необходимости вызывает себя для внутреннего исключения.

0 голосов
/ 08 октября 2013

Вот похожая вещь, которую я сделал: FormatException

public static string FormatErrorMessage(Exception ex)
{
    var result = "Exception: " + ex.GetType().Namespace + "." + ex.GetType().Name + "\r\n";

    result += "******Exception message****\r\n";
    result += ex.Message + "\r\n\r\n";

    if (string.IsNullOrEmpty(ex.StackTrace) == false)
    {
        result += "******Stack trace**********\r\n";
        result += ex.StackTrace + "\r\n\r\n";
    }

    if (ex.InnerException != null)
    {
        result += "******Inner exception******\r\n";
        result += FormatErrorMessage(ex.InnerException);
    }

    return result;
}
...