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

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

40 голосов
/ 28 сентября 2008

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

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

Ответы [ 4 ]

18 голосов
/ 28 сентября 2008

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

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

16 голосов
/ 28 сентября 2008

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

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

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

11 голосов
/ 22 мая 2015

Поскольку ни один из ответов не содержит код. В дополнение к этому вопросу может пригодиться то, как на самом деле посмотреть словарь .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();
10 голосов
/ 08 марта 2010

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

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

Для более подробной информации вот мой блог на тему :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...