如何防止Windows捕获我的Perl异常?

时间:2008-12-09 14:22:16

标签: perl exception signals

我有这个应该24/7全天候运行的Perl软件。它会保持与IMAP服务器的连接,检查新邮件,然后对新邮件进行分类。

现在我有一个用户每隔一段时间就在休眠他的XP笔记本电脑。发生这种情况时,与服务器的连接将失败并触发异常。调用代码通常会捕获该异常并尝试重新连接。但在这种情况下,似乎Windows(或Perl?)正在捕获异常并通过消息框将其提供给用户。

任何人都知道如何防止这种wtf?我的代码可以捕获“系统即将休眠”的信号吗?

清除你已经提出的一些观点:

  • 用户冬眠他们的机器没问题。我只需要找到一种方法来解决这个问题。
  • 有问题的Perl模块会抛出异常。它做了类似“die'foo bar'的事情。虽然应用程序完全基于浏览器,并且不使用Wx或Tk之类的东西,但是用户会得到一个标题为”poll_timer“的消息框。该消息框的内容正是内容$ @(在这个例子中是'foo bar')。
  • 使用perlapp将应用程序编译为可执行文件。但是,文档没有提到有关异常处理的任何内容。

4 个答案:

答案 0 :(得分:1)

我认为你正在处理操作系统级别的异常,而不是从Perl抛出的东西。相关的Perl模块正在调用DLL中的某些东西(我推测),并且异常被抛出。您最好的选择是将其归结为一个简单的,可复制的测试用例,该测试用例会触发异常(您可能需要进行大量的休眠和唤醒此过程所涉及的计算机)。然后,将此信息发送给模块开发人员,并询问他们是否能够以对您更有用的方式捕获此异常。

如果模块开发人员不能或不会提供帮助,那么您可能最终需要使用Perl调试器来调试模块的代码并查看到底发生了什么,并查看是否有办法您可以自己更改模块以捕获和处理异常。

答案 1 :(得分:0)

您的用户不是例外,而是规则。我的笔记本电脑在工作和家庭之间休眠。在工作中,它在DHCP网络上;在家里,它完全在另一个。尽管IP地址的多样性令人困惑(VMWare,VPN,通过NAT路由器的普通旧连接),大多数程序仍继续工作。那些没有的(AT& T Net Client,用于VPN - 在办公室中未使用,在家或在路上必需)识别休眠时间的断开连接(AT& T Net Client支持StandBy / Hibernate进程,直到它已断开连接),并在机器唤醒时重新建立连接。在机场,我使用本地WiFi(更多DHCP),但在登机前完全关闭无线(一个物理交换机)。

因此,您需要了解如何了解机器进入待机或休眠模式以使您的软件可用。我很遗憾,我很遗憾,这是你需要做的事情。

Google的一些工作表明ACPI(高级配置和电源接口)是解决方案的一部分(Microsoft)。 APM(高级电源管理)也可能是相关的。

答案 2 :(得分:0)

如果没有看到相关的代码,就很难提供智能建议。如果您收到带有异常消息的对话框,则该程序最有可能使用TkwxPerl GUI库,这可能会使事情变得复杂。话虽如此,我的猜测是,通过将故障点包装在eval块中并在调用后测试$ @,可以很容易地修改程序中的异常处理。如果$ @包含指示连接失败的错误消息,则重新建立连接并继续前进。

答案 3 :(得分:0)

我发现了一个黑客,以避免硬错误的模态系统对话框(例如“遇到和异常,需要关闭”)。我不知道同样的技巧是否适用于你所描述的这种错误,但是你可以尝试一下。

请参阅:Avoiding the “encountered a problem and needs to close” dialog on Windows

简而言之,设置 HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\的Windows \ ErrorMode 注册表项为值“2”。