как перехватить исключение в службе и не дать ей упасть?

284
15 января 2017, 14:38

Сама служба устроена так, что в ней работают несколько Thread'ов. Необработанные исключения вызывают ее падения Пробовал: `Application.ThreadException += Application_ThreadException;' не брало (м.б., потому что в другом потоке ошибки падали) Это: 'AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;' помогло больше, по крайней мере смог запихать ошибку в лог. Но служба остановилась.

Как сделать, чтобы ее работа не прерывалась, а ошибка обработалась и записалась в лог?

Answer 1

Мне слабо представляется служба, которая при необработанных исключениях продолжает свою работу.

Например, есть служба, которая что-то получает от пользователя и пишет это в базу.

Представим, что запись в базу- это необрабатываемое исключение(Например, пустой блок catch, что бы приложение не упало).

Получается, что служба продолжает работу и в этом случае у пользователя создается впечатление, что все хорошо, а на самом деле его данные не пишут в БД.

Вывод: Предусмотрите все исключения и их обработку, в противном случае будет создаваться видимость корректной работы, а по факту будет непредсказуемое поведение. Если вы действительно не ожидаете такого поведения, то пусть служба падает с записью в лог. Анализируя лог, вы получите место возникновения ошибки, где сможете предусмотреть новое место обработки исключения, если это возможно.

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

Если служба многофункциональная, то можно где-нибудь хранить данные об активных функциях.

Если в потоке, который реализует функцию произошло необрабатываемое исключение(, которое убило поток, то делаем эту функцию недоступной.

При вызове конкретной функции, ищем ее в коллекции функций и проверяем, что ее можно использовать.

Получается, что служба работает корректно, но часть функционала не работает.

READ ALSO
Использование C++ кода в C#

Использование C++ кода в C#

Народ, подскажите, как использовать shared_ptr в C# ?

277
C# Задание на вектор

C# Задание на вектор

Даны булевы вектора a и b длины nЕсли возможно, упорядочить их, или вывести сообщение "Вектора несравнимы" P

323
Извлечь степень php

Извлечь степень php

Здравствуйте

416
Счетчик просмотров php

Счетчик просмотров php

Сделал счетчик просмотров страницы

292