Для 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')
Хорошо, вот что я придумал. Я реализовал класс расширения, который воспроизводит исходный механизм форматирования исключений, но с изюминкой: пользовательский делегат 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);
});
}
Вы можете вручную добавить данные по умолчанию в строку, возвращаемую ToString
, просмотрев свойства исключения. Например, следующее будет моделировать данные, возвращаемые по умолчанию методом исключения ToString
(при условии, что нет внутренних исключений):
string.Format("{0}: {1}\r\n{2}", this.GetType().Name, this.Message, this.StackTrace);
Или вы можете просто добавить (или добавить) данные, возвращаемые base.ToString
к информации, которую вы хотите добавить.
Вы можете переопределить метод ToString (), включив в него вашу собственную информацию, и по-прежнему вызывать базовое исключение ToString () по умолчанию следующим образом:
public class MyException : Exception
{
public string CustomField { get; set; }
public override string ToString()
{
return CustomField + Environment.NewLine + base.ToString();
}
}
Если вы в первую очередь смотрите на них в отладчике, вы можете использовать атрибут [DebuggerDisplay]
, чтобы указать их форматирование, и не касаться существующего метода ToString
.
В противном случае. , просто перегрузите ToString
и обязательно вызовите версию базового класса base.ToString ()
Внутри переопределения вызовите base.ToString () и измените полученную строку в соответствии с вашими потребностями ...