这感觉就像以前可能会被问到的一个问题,但我找不到它,所以我想(可能再次)。
我正在编写一个Windows服务来进行一些文件监控和处理。它完全按照我的要求行事,但我知道在对文件系统或事件日志进行读/写操作时,我的代码可能会出现几个错误。我准备加入一些尝试/捕获,我希望有错误,但我想做一些全局错误处理来获取所有那些不可预见的问题。我不知道怎么做。
我的第一个想法是寻找某种类似于我在ASP.NET项目中找到的全局错误处理程序,但在这些行中看不到任何内容。
另一个想法是我可以获得所有顶级函数调用并在它们周围放置一个try / catch。正如我所看到的那样,这意味着在我的所有事件处理程序代码和我的服务Start和Stop方法中放置一个try / catch。这不是一种好方法,所以我想我可能以错误的方式接近这个。任何人都可以建议我在错误处理方面应该做些什么吗?
我认为在服务中我不希望它只是抛出错误,因为它可能会停止服务,或者我实际上应该让服务崩溃并通过我见过的恢复机制自动重启它?
我在这里很不确定所以请与我分享你的智慧...... :)
答案 0 :(得分:6)
将try / catch放在服务的main方法中并记录错误以便修复它们没有问题。如果捕获的错误是意外的,那么您可以干净地关闭服务。
此外,除了主要的try / catch之外,您还必须为每个可能无法避免发生的异常(即网络问题)添加try / catch,以便您可以采取相应措施以恢复正确的行为。应用程序,避免服务崩溃。
最后,请记住,您必须为每个不同线程的每个top方法执行此操作,因为异常不会传播到线程范围之外。
答案 1 :(得分:0)
我们已经在多年来编写的许多Windows服务中成功使用了它。
我们总是在dll中使用这些功能。在服务中,当我们在dll中实例化并运行函数时,我们将调用包装在try / catch中。然后,该服务可以记录或响应所引发的任何不可预见的异常。
当然,您可以在try / catch块中将可疑代码包装在dll中并执行适当的操作。
答案 2 :(得分:0)
服务永远不会失败。通常,服务中的事物由事件(网络调用或计时器)触发......为每个事件运行的代码应该在try catch中,这样服务永远不会停止。
我建议记录到EventLog的错误和其他重要信息。您可以使用log4net + EventLogAppender来执行此操作。
由于硬盘问题(如完整磁盘或内存问题),服务仍然会发生故障。如果要自动重新启动,可以在“NT服务选项”对话框或“安装程序”中设置恢复。