Можно ли (неправильно) использовать Exception.HelpLink для распознавания объектов Exception?

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

Идея, которую я придумала, состоит в том, чтобы неправильно использовать HelpLink поле Exception объект. Я сделаю так, чтобы он содержал строковую версию моего "номера исключения". Тогда я могу распознать Exception объект, если он обнаруживается снова на мгновение в другом вызове журнала.

Но разве это плохая идея? Есть ли какие-то ошибки, о которых я не думал? Если так, у кого-нибудь есть идея получше?

РЕДАКТИРОВАТЬ: Чтобы объяснить ситуацию немного больше, этот регистратор будет использоваться только в моих собственных программах.

5 ответов

Решение

Вместо "злоупотребления" HelpLink собственность, вы можете использовать Data свойство, чтобы добавить дополнительную информацию к Exception, Он содержит пары ключ / значение, которые предоставляют дополнительную пользовательскую информацию об исключении.

Хотя я согласен с TheVillageIdiot, я хотел бы отметить, что в более общем смысле, если вы хотите изменить поведение Exception, вам следует создать свой собственный класс Exception, который добавляет дополнительную соответствующую информацию. Вот почему мы используем наследственность и полиморфизм, в конце концов.:)

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

Еще лучше вы можете изучить варианты использования log4net для регистрации и пользовательского интерфейса отчетов для форматирования / группировки исключений из файлов журналов или таблиц базы данных, созданных / обновленных log4.net

Ваш код не должен перехватывать и регистрировать исключения на каждом уровне. Нет причин, по которым ваш код должен когда-либо видеть одно и то же исключение дважды. Это звучит очень похоже на то, что вы используете "ловить каждое исключение", что является основным анти-паттерном.

Нет, недопустимо злоупотреблять справочной службой. Как упомянул @Greebo, если вам нужны дополнительные свойства, вы можете создать свои собственные классы исключений. Альтернативой может быть использование Data свойство, которое является частью System.Exception учебный класс.

Вопрос: Ваши обработчики исключений выполняют какую-либо обработку, кроме регистрации?

Если нет, то, скорее всего, вам не нужны обработчики. Просто позвольте исключению (используя блок finally для очистки) скопировать стек вызовов и обработать его на самом верхнем уровне. Если ваши обработчики обрабатывают исключение, тогда я не уверен, почему у вас будет такое же исключение дальше по стеку. Я думаю, что было бы более вероятно, что вы создадите новое исключение, устанавливающее внутреннее исключение для того, которое было обработано.

Другие вопросы по тегам