我们可以在Windows服务中吞下未处理的异常吗?

时间:2012-07-09 10:52:18

标签: c# windows-services

我在c#中使用Windows服务进行文件传输,使用sFTP(ssh.net)。 我已经处理了每个代码块中的异常,但仍然遇到未处理的异常,我的Windows服务崩溃了。

我通过使用

找出了未处理的异常
AppDomain.CurrentDomain.UnhandledException

可以避免这种未处理的异常并避免服务崩溃。

提前致谢。 维杰

3 个答案:

答案 0 :(得分:3)

不,因为UnhandledException并未改变流程正在减少的事实。它只是让你有机会在发生之前做一些事情(例如记录失败)。

即使事情可以这样,但事实是你的服务有bug。您应该更多地修复它们而不是隐藏它们。

答案 1 :(得分:1)

  

可以避免这种未处理的异常并避免服务崩溃。

是的,确实如此。这也是一个糟糕的设计决定。

  

AppDomain.CurrentDomain.UnhandledException

这是一个放置最后一个处理程序的好地方,它会编写崩溃报告,然后重新启动服务。

吞咽异常并不聪明。您期望的每个例外都必须处理。

  

我已经处理了每个代码块中的异常,但我还是处理不当   例外

听起来你不知道自己在做什么。没有必要在每个代码块中处理异常 - 它使用异常处理程序完全重载代码。但是,有必要在有意义的情况下进行适当的异常处理并捕获每个可感知(可预期)的异常。

避免服务崩溃并不聪明 - 因为如果你不知道你有什么例外,那么你可能最终会得到一个腐败的服务而不是一个崩溃的服务。快速而艰难的失败仍然是编写可靠服务器系统的唯一途径。

答案 2 :(得分:0)

避免未处理的异常的唯一方法就是不要有一个!假设您的服务没有使用任何可能在不同线程上抛出异常的多线程功能,您可以放弃在ServiceBase.Run调用周围放置异常处理程序

这样一来,任何漏洞的例外都可以在最后一刻捕获并处理。通常你想尝试抓住这些低位并相应地处理

使用线程化应用程序会变得有点困难,因为每个生成的新线程都不会抛出主线程,并且不会被这个“全能”处理程序处理。

编辑:

我可能会补充一点,我不会宽恕这样做 - 理想情况下你应该在正确的地方处理异常 - 如果你得到未经处理的未处理的异常,那么你需要检查堆栈并看看出了什么问题。向AppDomain.UnhandledException添加处理程序并将异常树和堆栈写入日志将有所帮助(您确实有一些日志记录机制,对吧?)。无论是那个还是调试