Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将服务执行封闭在try-catch中:糟糕的做法?_C#_Windows Services_Try Catch - Fatal编程技术网

C# 将服务执行封闭在try-catch中:糟糕的做法?

C# 将服务执行封闭在try-catch中:糟糕的做法?,c#,windows-services,try-catch,C#,Windows Services,Try Catch,下面是windows服务程序的常用Program.cs内容: static class Program { /// <summary> /// The main entry point for the application. /// </summary> static void Main() { ServiceBase[] ServicesToRun; ServicesToRun = new Ser

下面是windows服务程序的常用Program.cs内容:

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);
    }
}
静态类程序
{
/// 
///应用程序的主要入口点。
/// 
静态void Main()
{
ServiceBase[]ServicesToRun;
ServicesToRun=新的ServiceBase[]
{ 
新MyService()
};
ServiceBase.Run(ServicesToRun);
}
}
ServiceBase.Run(…)
封装在try-catch块中是一种不好的做法吗

谢谢


编辑:

执行了一些测试并发现(测试方法:向服务发送自定义命令,该服务在OnCustomCommand覆盖中引发ApplicationException):

A.在try/catch中封装ServiceBase.Run()不会捕获OnCustomCommand中引发的异常,因为当服务线程开始执行时,try块已在作用域中。因此,质疑这种方法的核心是无关紧要的,只要它不能满足它的目的

B.为AppDomain.CurrentDomain.UnhandledException添加处理程序也未捕获异常


但是,在这两种情况下,异常都显示在Windows事件日志中。这很好地解决了我需要知道在服务执行过程中什么时候崩溃的问题,但问题仍然存在:是否存在这样的情况:服务可能会在事件日志中没有任何跟踪的情况下悄无声息地崩溃?

这取决于您正在做什么。如果您打算处理异常并对它们做一些有用的事情(例如重试、运行备份、通知用户并要求反馈等),那么我认为这不是一个坏做法


正如我所说,这取决于你在做什么。

该服务的主要方法中充满了try-catch,但即便如此,该服务似乎还是意外地关闭了(我说“似乎”,因为我真的不知道它是否崩溃或被某人手动停止;它运行在一个不同的、相当隔离的环境中)。我想在ServiceBase.Run()周围添加try-catch块,只是为了能够区分停止/崩溃,但我不确定这是否是长期运行进程的有效设置。该设置看起来确实很脆弱。您必须检查特定的异常,以了解服务何时停止以及何时崩溃,但您还将捕获其他异常。如果您的服务位于远程计算机上,并且网络崩溃,那么您将拥有一个既没有停止也没有崩溃的服务。将日志信息添加到您的服务的OnStop、OnShutdown等方法中,并让它记录所发生的事情;也许,如果你发现服务到底发生了什么,你会对事情有一个新的看法,并从那里开始。