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

Использование Exception.Data

Как вы использовали свойство Exception.Data в проектах С#, над которыми вы работали?

Я бы хотел получить ответы, предлагающие шаблон, а не те, которые очень специфичны для вашего приложения.

4b9b3361

Ответ 1

Исключительный логгер, который я использую, был изменен, чтобы выписать все элементы в коллекции данных. Затем для каждого исключения мы сталкиваемся с тем, что мы не можем диагностировать из стека исключений, мы добавляем во все данные в этой области функции, отправляем новую сборку и ожидаем ее повторной обработки.

Я думаю, мы оптимисты в том, что мы не помещаем его в каждую функцию, но мы пессимисты в том, что мы не вынимаем его, как только мы исправим проблему.

Ответ 2

Я использовал его, когда знал, что исключение, которое я создаю, нужно будет сериализовать. Используя Reflector в один прекрасный день, я обнаружил, что Excepion.Data застревает и вытягивается из потоков сериализации.

Итак, в основном, если у меня есть свойства в настраиваемом классе исключения, которые уже являются сериализуемыми типами, я реализую их в производном классе и использую базовый объект данных в качестве своего механизма хранения, а не создаю частные поля для хранения данных. Если свойства моего настраиваемого объекта исключения требуют более продвинутой сериализации, я обычно реализую их, используя резервные частные поля и обрабатывая их сериализацию в производном классе.

Нижняя строка, Exception.Data дает вам сериализацию бесплатно, просто вставляя в нее свои свойства, но просто помните, что эти элементы должны быть сериализуемыми!

Ответ 3

Я использовал его для захвата информации о состоянии во время Исключения из охватывающей области, поскольку Исключение перемещает стек. Такие элементы, как имя файла, вызвавшее исключение, или значение некоторого идентификатора, которое поможет отследить проблему.

На самом верхнем уровне в веб-приложении я также хочу добавить большую часть информации Запроса, такой как RawUrl, куки, Referrer,...

Подробнее... мой блог по теме:

Вместо того, чтобы ждать возникновения проблем, я добавляю этот код везде, где может возникнуть исключение, связанное с чем-то внешним, например. имя файла или URL-адрес, к которому обращались,... Другими словами, любые данные, которые помогут воспроизвести проблему.

Ответ 4

Поскольку ни один из ответов не содержит кода. Что-то, что может быть полезным в качестве дополнения к этому вопросу, - это как посмотреть на словарь .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();