Как вы использовали свойство Exception.Data в проектах С#, над которыми вы работали?
Я бы хотел получить ответы, предлагающие шаблон, а не те, которые очень специфичны для вашего приложения.
Как вы использовали свойство Exception.Data в проектах С#, над которыми вы работали?
Я бы хотел получить ответы, предлагающие шаблон, а не те, которые очень специфичны для вашего приложения.
Исключительный логгер, который я использую, был изменен, чтобы выписать все элементы в коллекции данных. Затем для каждого исключения мы сталкиваемся с тем, что мы не можем диагностировать из стека исключений, мы добавляем во все данные в этой области функции, отправляем новую сборку и ожидаем ее повторной обработки.
Я думаю, мы оптимисты в том, что мы не помещаем его в каждую функцию, но мы пессимисты в том, что мы не вынимаем его, как только мы исправим проблему.
Я использовал его, когда знал, что исключение, которое я создаю, нужно будет сериализовать. Используя Reflector в один прекрасный день, я обнаружил, что Excepion.Data застревает и вытягивается из потоков сериализации.
Итак, в основном, если у меня есть свойства в настраиваемом классе исключения, которые уже являются сериализуемыми типами, я реализую их в производном классе и использую базовый объект данных в качестве своего механизма хранения, а не создаю частные поля для хранения данных. Если свойства моего настраиваемого объекта исключения требуют более продвинутой сериализации, я обычно реализую их, используя резервные частные поля и обрабатывая их сериализацию в производном классе.
Нижняя строка, Exception.Data дает вам сериализацию бесплатно, просто вставляя в нее свои свойства, но просто помните, что эти элементы должны быть сериализуемыми!
Я использовал его для захвата информации о состоянии во время Исключения из охватывающей области, поскольку Исключение перемещает стек. Такие элементы, как имя файла, вызвавшее исключение, или значение некоторого идентификатора, которое поможет отследить проблему.
На самом верхнем уровне в веб-приложении я также хочу добавить большую часть информации Запроса, такой как RawUrl, куки, Referrer,...
Подробнее... мой блог по теме:
Вместо того, чтобы ждать возникновения проблем, я добавляю этот код везде, где может возникнуть исключение, связанное с чем-то внешним, например. имя файла или URL-адрес, к которому обращались,... Другими словами, любые данные, которые помогут воспроизвести проблему.
Поскольку ни один из ответов не содержит кода. Что-то, что может быть полезным в качестве дополнения к этому вопросу, - это как посмотреть на словарь .Data
. Поскольку это не общий словарь и возвращает только IDictionary
foreach(var kvp in exception.Data)
тип kvp фактически будет object
бесполезным. Однако из MSDN существует простой способ повторить этот словарь:
foreach (DictionaryEntry de in e.Data)
Console.WriteLine(" Key: {0,-20} Value: {1}",
"'" + de.Key.ToString() + "'", de.Value);
Я действительно не знаю, что означал бы аргумент формата , -20
, возможно, Take (20)? Отвлечение... этот код может быть очень полезен в общем журнале ошибок, чтобы развернуть эти данные. Более полное использование будет похоже на:
var messageBuilder = new StringBuilder();
do
{
foreach (DictionaryEntry kvp in exception.Data)
messageBuilder.AppendFormat("{0} : {1}\n", kvp.Key, kvp.Value);
messageBuilder.AppendLine(exception.Message);
} while ((exception = exception.InnerException) != null);
return messageBuilder.ToString();