Включение выполнения сервиса в try-catch: плохая практика? - PullRequest
2 голосов
/ 10 мая 2010

Ниже приведен обычный контент Program.cs для служебной программы Windows:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new MyService() 
        };
        ServiceBase.Run(ServicesToRun);
    }
}

Это плохая практика заключать ServiceBase.Run(...) в блок try-catch?

Спасибо.


EDIT:

Выполнены некоторые тесты и найдено (метод теста: отправить пользовательскую команду службе, которая вызывает исключение ApplicationException в переопределении OnCustomCommand):

A. Включение ServiceBase.Run () в try / catch не перехватывает исключение, генерируемое в OnCustomCommand, поскольку блок try уже находился в области действия, когда поток службы начал выполняться. Следовательно, ставить под сомнение суть этого метода не имеет значения, если он в любом случае не выполняет своего предназначения.

B. Добавление обработчика для AppDomain.CurrentDomain.UnhandledException также не перехватило исключение.

Однако в обоих случаях исключение обнаружилось в журнале событий Windows. Это в значительной степени решает мою необходимость знать, когда происходит сбой во время выполнения службы, но остается вопрос: есть ли случаи, когда служба может молча аварийно завершить работу без какого-либо следа в журнале событий?

1 Ответ

2 голосов
/ 10 мая 2010

Это зависит от того, что вы делаете. Если вы собираетесь обрабатывать исключения и делать с ними что-то полезное (например, повторить попытку, выполнить резервное копирование, уведомить пользователя, запросить обратную связь и т. Д.), То, IMO, я не думаю, что это плохая практика.

Как я уже сказал, это зависит от того, что вы делаете.

...