Перехват исключений в службе Windows

109
14 марта 2021, 08:20

Есть служба Windows, которая является хостом для WCF-службы. При инициализации службы Windows подписываюсь на событие

AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
private void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Logger.Error("UNHANDLED", e.ExceptionObject);
}

Периодически служба падает и я могу наблюдать только запись с кодом 7034 в журнале системы о том, что служба неожиданно прервана.

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

UPD

Вывод команды sc query после краша:

SERVICE_NAME: LWPServiceHost
TYPE: 10 WIN32_OWN_PROCESS
STATE: 1 STOPPED
WIN32_EXIT_CODE: 1067 (0x42b)
SERVICE_EXIT_CODE: 0 (0x0)
CHECKPOINT: 0x0
WAIT_HINT: 0x0
Answer 1

В итоге выяснилось, что виной падений является попытка одновременного обращения к COM-компоненту в нескольких потоках (в следствии ошибки в конфигурации WCF-службы). При этом не вырабатывалось исключение, а служба просто завершала свою работу.

При возникновении подобных проблем стоит обратить внимание на системный журнал "Приложение". В нем я нашел события с кодом 1000 по моей службе, где была информация о сбойном модуле.

@Alexander Petrov в комментариях к посту предоставил ссылку на отличную статью, в которой подробно описана обработка исключений в службах Windows.

Спасибо @Alexander Petrov и @MSDN.WhiteKnight за помощь!

Answer 2

Создать отдельный общий класс ошибок типа SamplError

//Чисто для примера взял из головы
     class SamplError
        {
            [DataMember]
            public string Reason = "";
            public SamplError()
            {
            }
            public SamplError(string error)
            {
                Reason = error;
            }
        }
//Добавим проверку на то, что имя уже есть
[DataContract]
    class SamplNameExistException : SemplError { }
//Пример вызова
    try{}
    catch (Exception e)
                {
                    throw new FaultException<SamplNameExistException >(new SamplNameExistException(), e.Message);
                }

вот неплохая статья про Ваш случай https://docs.microsoft.com/ru-ru/dotnet/api/system.appdomain.unhandledexception?view=netframework-4.8

READ ALSO
Как создать WebHook MVC страницу?

Как создать WebHook MVC страницу?

Мне необходимо приложение "WinForm" для переписки в viber"Webhook" планируется для получения данных(событий) из viber, далее полученные данные будут использоваться...

86
Передача Int массива из C# в Dll на C++

Передача Int массива из C# в Dll на C++

Пытаюсь передать массив Int из C# в C++Выскакивает ошибка:

129
TrimmingText для TextBlock с MultiBinding

TrimmingText для TextBlock с MultiBinding

Не получается решить проблемуУ меня есть TextBlock, который показывает имя файла и расширение

102