【问题标题】:Global handling exception in window service窗口服务中的全局处理异常
【发布时间】:2011-06-28 10:37:40
【问题描述】:

我有一个 Windows 服务作为服务器运行。但是,服务器有时会因未处理的错误而立即停止。请帮助我如何处理全局异常。谢谢。

【问题讨论】:

  • 不确定您的代码库,但通常的方法是在入口点周围放置一个静默异常处理程序。
  • 是处理还是忽略?
  • 您是想在服务终止之前记录错误还是做一些补偿并继续运行?
  • 请注意,当 Gunner 说“通常的方法是在入口点周围放置一个静默异常处理程序”时,他的意思是 愚蠢 方法。不幸的是,由于 cmets 不可编辑,我无法为他修复这个小错误。
  • 谢谢大家。我有这个问题是因为我从一个人那里收到了这个项目。他不处理此服务中的异常。有时,此服务会因为未处理的错误而停止。我想找到一个快速的解决方案,以便我可以捕获任何未处理的异常。我想使用全局异常处理程序,但我不知道如何在 Windows 服务中使用。谢谢。

标签: c# .net windows-services


【解决方案1】:

在我看来,您试图以错误的方式解决问题......

当您的程序(或服务)由于未处理的错误而崩溃时,解决方案不是弄清楚在何处以及如何“处理”所有未处理的错误,以便您可以忽略它们并继续执行. in this answer 我已经更清楚地讨论了这个观点,但简短的版本是,当您遇到未处理的异常时,正确的做法是崩溃。正如原始答案中所引用的:

发生未处理的异常意味着服务器处于意外状态。通过捕获异常并说“别担心,一切都很好”,您最终会让损坏的服务器继续运行。

[ . . . ]

捕获所有异常并让进程继续运行假定服务器可以从意外故障中恢复。但这是荒谬的。您已经知道服务器无法恢复:它崩溃了!

更好的是让服务器崩溃,以便可以在故障点捕获崩溃转储。现在你有机会弄清楚发生了什么。

所以事实上,真正的解决方案涉及找出未处理异常的根本原因并修改您的代码以首先防止该错误发生。

除非您发布您收到的确切异常消息,最好是完整的堆栈跟踪,否则我们无法帮助您做到这一点。但您肯定希望保留所获得的调试信息,而不是想出一种完全忽略它的方法——这是真正解决问题的唯一方法。

如果你仍然坚持无视所有相反的善意建议,你会发现“把头埋在沙子里不理会”的做法detailed here

【讨论】:

  • 我有这个问题是因为我从一个人那里收到了这个项目。他不处理此服务中的异常。有时,此服务会因为未处理的错误而停止。我想找到一个快速的解决方案,以便我可以捕获任何未处理的异常。我想使用全局异常处理程序来了解异常的原因以及导致此异常修复它的位置,但我不知道如何在 windows 服务 中使用。谢谢。
  • @Lu Lu:不知道你为什么加粗“windows service”。事实上,我的回答确实谈到了服务。
  • 我不同意在窗口服务上下文中的这个答案。如果服务崩溃,则无法处理进一步的工作。这真的是您想要的行为,因为他们的服务需要重新启动?更可取的是适当地处理个别异常,但要捕获所有未处理的异常并记录问题。这意味着服务不会停止,并且您有一些信息可以让您编写更有针对性的异常处理。
  • 捕获所有异常不是一个有效的策略,因为很多异常是无法捕获的。此外,抛出异常的事实表明您的服务状态已受到损害并且不再受信任。如果继续,您可能仍然崩溃,或者更糟的是,您可能会损坏数据。您需要重新启动它;你真的别无选择。如有必要,请使用“看门狗”服务。如果您正在谈论捕获您可以实际处理的 expected 异常,那当然是完全不同的,但应尽可能在本地处理异常处理程序。 @使用
【解决方案2】:

您可以尝试使用AppDomain.CurrentDomain.UnhandledException 事件,尽管我不确定它是否会捕获每个未处理的异常。

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 2016-11-03
    • 2019-10-26
    • 1970-01-01
    • 2019-07-18
    • 2017-02-24
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多