0

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

我通过使用发现了未处理的异常

AppDomain.CurrentDomain.UnhandledException

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

提前致谢。维杰

4

3 回答 3

4

不,因为UnhandledException不会改变进程正在下降的事实。它只是让您有机会在此之前做某事(例如记录失败)。

即使事情可以这样工作,但事实是您的服务存在错误。您应该更多地寻找修复它们而不是隐藏它们。

于 2012-07-09T10:55:06.670 回答
1

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

是的。这也是一个糟糕的设计决策。

AppDomain.CurrentDomain.UnhandledException

这是放置写崩溃报告然后重新启动服务的最后手段处理程序的好地方。

吞下异常并不聪明。必须处理您期望的每个异常。

我在每个代码块中都处理了异常,但我仍然收到未处理的异常

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

避免服务崩溃并不聪明——因为如果你不知道你有什么异常,那么你最终可能会得到一个损坏的服务而不是一个崩溃的服务。快速而艰难地失败仍然是编写可靠服务器系统的唯一方法。

于 2012-07-09T10:56:23.397 回答
0

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

这样,任何漏掉的异常都可以在最后一分钟被捕获并处理。通常,尽管您想尝试将它们向下抓住并相应地处理

对于线程应用程序,它变得有点困难,因为生成的每个新线程都不会抛出主线程,也不会由这个“包罗万象”的处理程序处理。

编辑:

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

于 2012-07-09T10:58:00.570 回答