C#: Переопределение ToString () метод для пользовательских исключений

Для Python 2.x используйте модуль StringIO . Например:

>>> from cStringIO import StringIO
>>> f = StringIO('foo')
>>> f.read()
'foo'

я использую cStringIO (который быстрее), но обратите внимание, что он не делает , принимают строки Unicode, которые не могут быть закодированы как простые строки ASCII . (Можно переключиться на StringIO путем изменения "от cStringIO" на "от StringIO".)

Для Python 3.x, используйте io модуль.

f = io.StringIO('foo')

23
задан Konamiman 15 June 2015 в 09:36
поделиться

5 ответов

Хорошо, вот что я придумал. Я реализовал класс расширения, который воспроизводит исходный механизм форматирования исключений, но с изюминкой: пользовательский делегат Action, который предоставляет подключаемый модуль для форматирования настраиваемых полей:

public static class ExceptionFormatterExtensions
{
    public static string ExceptionToString (
        this Exception ex, 
        Action<StringBuilder> customFieldsFormatterAction)
    {
        StringBuilder description = new StringBuilder();
        description.AppendFormat("{0}: {1}", ex.GetType().Name, ex.Message);

        if (customFieldsFormatterAction != null)
            customFieldsFormatterAction(description);

        if (ex.InnerException != null)
        {
            description.AppendFormat(" ---> {0}", ex.InnerException);
            description.AppendFormat(
                "{0}   --- End of inner exception stack trace ---{0}",
                Environment.NewLine);
        }

        description.Append(ex.StackTrace);

        return description.ToString();
    }
}

Теперь вы можете использовать этот метод в своем собственном ToString ( ) реализации без дублирования кода форматирования:

    public override string ToString()
    {
        return this.ExceptionToString(
            description =>
            {
                description.AppendFormat(
                    ", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
            });
    }
12
ответ дан 29 November 2019 в 00:58
поделиться

Вы можете вручную добавить данные по умолчанию в строку, возвращаемую ToString , просмотрев свойства исключения. Например, следующее будет моделировать данные, возвращаемые по умолчанию методом исключения ToString (при условии, что нет внутренних исключений):

string.Format("{0}: {1}\r\n{2}", this.GetType().Name, this.Message, this.StackTrace);

Или вы можете просто добавить (или добавить) данные, возвращаемые base.ToString к информации, которую вы хотите добавить.

13
ответ дан 29 November 2019 в 00:58
поделиться

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

public class MyException : Exception
{
    public string CustomField { get; set; }
    public override string ToString()
    {
        return CustomField + Environment.NewLine + base.ToString();
    }
}
10
ответ дан 29 November 2019 в 00:58
поделиться

Если вы в первую очередь смотрите на них в отладчике, вы можете использовать атрибут [DebuggerDisplay] , чтобы указать их форматирование, и не касаться существующего метода ToString .

В противном случае. , просто перегрузите ToString и обязательно вызовите версию базового класса base.ToString ()

4
ответ дан 29 November 2019 в 00:58
поделиться

Внутри переопределения вызовите base.ToString () и измените полученную строку в соответствии с вашими потребностями ...

1
ответ дан 29 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: