Как сделать обработку ошибок в Windows .NET Services - PullRequest
3 голосов
/ 12 июля 2010

Это похоже на вопрос, который, возможно, задавался раньше, но я не смог его найти, поэтому спрашиваю (возможно, снова).

Я пишу службу Windows, чтобы выполнить небольшой мониторинг файлов иобработка.Все делает то, что я хочу, но я знаю, что есть несколько мест, в которых мой код может выдавать ошибки при чтении / записи в файловую систему или журнал событий.Я собираюсь добавить некоторые try / catch, где я ожидаю, что будут ошибки, но я хотел сделать глобальную обработку ошибок, чтобы выявить все эти непредвиденные проблемы.Хотя я не уверен, как это сделать.

Моей первой мыслью было поискать какой-нибудь глобальный обработчик ошибок, похожий на тот, который я нахожу в проектах ASP.NET, но ничего не видел в этом направлении.

Другая мысль состояла в том, что я мог просто получить все свои вызовы функций высшего уровня и поставить вокруг них попытку / перехват.Насколько я понимаю, это означало бы поставить try / catch вокруг всего моего кода обработчика событий и моих сервисных методов Start и Stop.Это не похоже на хороший способ сделать это, поэтому я думаю, что я, вероятно, подхожу к этому неправильно.Кто-нибудь может подсказать, что я должен делать с точки зрения обработки ошибок?

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

Я здесь очень неуверен, поэтому, пожалуйста, поделитесь со мной своей мудростью ...:)

Ответы [ 3 ]

6 голосов
/ 12 июля 2010

Нет проблем в том, чтобы поместить метод try / catch в основной метод сервиса и зарегистрировать ошибки, чтобы вы могли их исправить.Если обнаруженная ошибка является неожиданной, вы можете закрыть службу без ошибок.

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

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

0 голосов
/ 12 июля 2010

Служба никогда не должна выходить из строя.Обычно вещи в сервисе запускаются событием (сетевым вызовом или таймером) ... Код, который запускается для каждого события, должен быть в перехвате попытки, чтобы сервис никогда не выходил из строя.

Я предлагаю вести журналв EventLog для ошибок и другой важной информации.Для этого вы можете использовать log4net + EventLogAppender .

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

0 голосов
/ 12 июля 2010

Мы успешно использовали это во многих службах Windows, которые мы написали на протяжении многих лет.

У нас всегда есть функциональность в DLL.В сервисе, когда мы создаем и запускаем функцию в dll, мы заключаем вызов в try / catch.Затем служба может регистрировать или реагировать на любые непредвиденные исключения, которые выдают.

Вы, конечно, оберните подозрительный код в dll в блоки try / catch и сделаете то, что там уместно.

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