4

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

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

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

为了澄清您已经提出的一些观点:

  • 我对用户休眠他们的机器没有任何问题。我只需要找到一种方法来处理它。
  • 有问题的 Perl 模块确实会引发异常。它执行类似“die 'foo bar' 的操作。尽管应用程序完全基于浏览器并且不使用 Wx 或 Tk 之类的任何东西,但用户会收到一个标题为“poll_timer”的消息框。该消息框的内容正是其内容$@ (本例中为“foo bar”)。
  • 该应用程序使用perlapp编译成可执行文件。但是,该文档没有提及有关异常处理的任何内容。
4

4 回答 4

1

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

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

于 2008-12-09T17:42:06.270 回答
0

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

请参阅:避免 Windows 上的“遇到问题并需要关闭”对话框

简而言之,将 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode 注册表项设置为值“2”。

于 2008-12-09T18:10:31.890 回答
0

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

因此,您需要了解如何了解机器正在进入待机或休眠模式以使您的软件可用。很抱歉,我没有的是你需要做的事情的秘诀。

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

于 2008-12-09T14:58:40.483 回答
0

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

于 2008-12-09T15:03:15.280 回答