Подтвердить что ты не робот

Какова наилучшая практика для сбора всех деталей внутреннего исключения?

Какова наилучшая практика для регистрации полных деталей исключения, включая все возможные внутренние исключения?

В настоящее время я использую следующий код:

try
{
    //some code that throws an exception
}
catch(Exception ex)
{
    do
    {
        Console.WriteLine(ex.Message+ex.StackTrace);
        ex=ex.InnerException;
    }while(ex!=null)
}

Существуют ли сценарии, в которых этот код может завершиться неудачей?

4b9b3361

Ответ 1

Вы пробовали использовать ex.ToString()? Он дает большинство (если не все) данных, которые вам нужно диагностировать, включая информацию о сообщении, трассировку стека и внутренние исключения:

От MSDN:

ToString возвращает представление текущего исключения, которое предназначенные для понимания людьми. Если исключение содержит чувствительные к культуре данные, представление строки, возвращаемое ToString необходимо учитывать текущую культуру системы. Несмотря на то что нет точных требований к формату возвращаемой строки, он должен попытаться отразить значение объекта, как это воспринимается Пользователь. Стандартная реализация ToString получает имя класс, который выбросил текущее исключение, сообщение, результат вызов ToString во внутреннем исключении и результат вызова Environment.StackTrace. Если любой из этих членов равен NULL, его значение равно не входит в возвращаемую строку.

Ответ 2

У меня есть этот метод расширения, который отлично подходит для моих целей.

public static class ExceptionExtensions {
    public static string ToMessageAndCompleteStacktrace(this Exception exception) {
        Exception e = exception;
        StringBuilder s = new StringBuilder();
        while (e != null) {
            s.AppendLine("Exception type: " + e.GetType().FullName);
            s.AppendLine("Message       : " + e.Message);
            s.AppendLine("Stacktrace:");
            s.AppendLine(e.StackTrace);
            s.AppendLine();
            e = e.InnerException;
        }
        return s.ToString();
    }
}

И используйте его следующим образом:

using SomeNameSpaceWhereYouStoreExtensionMethods;
try {
    // Some code that throws an exception
}
catch(Exception ex) {
    Console.WriteLine(ex.ToMessageAndCompleteStacktrace());
}

Update

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