Можно ли (неправильно) использовать 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 для очистки) скопировать стек вызовов и обработать его на самом верхнем уровне. Если ваши обработчики обрабатывают исключение, тогда я не уверен, почему у вас будет такое же исключение дальше по стеку. Я думаю, что было бы более вероятно, что вы создадите новое исключение, устанавливающее внутреннее исключение для того, которое было обработано.