如果有一个catch全部,c#服务可以崩溃吗?

时间:2011-08-17 08:48:56

标签: c# exception service

我有一个使用try catch块包围的启动例程启动的服务,如下所示。

    protected override void OnStart(string[] args)
    {
        try
        {
            Program.Start();
        }
        catch (Exception e)
        {
            Logger.Error("Exception during Service Start");
        }
    }

偶尔在某些计算机(1/100)上,它偶尔会打印出最后一行Program.Start(日志消息),然后失败,没有日志消息或事件日志消息。这有可能吗?

由于

编辑:该服务确实启动了一些其他线程,但它们以相同的方式封装

编辑:Logger是log4net的包装器 - 它在很多(100多个)机器上运行非常可靠(尽管可能是原因)

5 个答案:

答案 0 :(得分:3)

如果从已启动的线程中抛出异常但未捕获异常,则服务可能会崩溃。

您是否为每个应用程序域添加了处理程序未处理的异常?

例如:

  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler( CurrentDomain_UnhandledException );

EDIT 此外,您有Application.ThreadException事件,我忘了提及: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

答案 1 :(得分:2)

如果程序崩溃或从try块抛出异常,那么肯定会得到Logger.Error日志信息,但不会从系统获取事件日志。如果发生服务崩溃或未处理的异常,则仅记录服务上的事件日志。

答案 2 :(得分:2)

是的,这是可能的。例如,自.NET 2.0以来无法捕获StackOverflowException(请参阅the MSDN article about it)。

答案 3 :(得分:1)

我不清楚你的问题,但是如果你问的是你的应用程序是否会像这样的骨架崩溃,那么机会就会少得多。因为你有一个捕获所有块几乎所有类型的异常将被捕获,因此您的程序将优雅地结束。

如果它是一个重复的场景,你知道它最好以已知的方式处理它,然后通过例外来实现你想要的东西,因为通常是不明原因可能发生的时间。

答案 4 :(得分:1)

您可以在try-catch块中调用Logger组件,让我们知道会发生什么吗?您是否能够在没有Logger组件的情况下监控您的服务(即,基于服务应该产生的任何输出 - 如数据库更新)?

如果对Logger组件的调用失败,请尝试直接写入事件日志。把它放在try catch块中。由于Logger成功编写了Program.Start()中的最后一行,因此可能与尝试处置资源或类似内容失败有关,而这种情况并未记录。