2008-12-09 21 views
4

我有这个应该全天候运行的Perl软件。它保持打开与IMAP服务器的连接,检查新邮件,然后分类新邮件。如何防止Windows捕获我的Perl异常?

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

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

要清理你已经提出了一些要点:

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

回答

0

您的用户是不我的笔记本电脑在工作与家庭之间休眠,工作时,它在DHCP网络上;在家里,它完全在另一个网络上;尽管IP地址混乱多数,但大多数程序仍在继续工作(VMWare,VPN ,通过NAT路由器的普通旧连接) (AT & T Net Client,对于办公室内未使用的VPN,在家中或在路上需要)在休眠时间时识别断开连接(AT &)T Net Client保持StandBy/Hibernate进程直到它断开连接),并且在机器醒来时适当地重新建立连接。在机场,我使用本地WiFi(更多的DHCP),但在登机前将所有无线(一个物理交换机)转向。

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

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

0

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

+0

我既不使用Tk也不使用Wx。该应用程序完全基于浏览器。这正是我对这个消息框有点无知的原因。我的应用程序不知道如何生成消息框。 – innaM 2008-12-09 15:18:07

1

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

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

+0

好消息是我是Perl模块的开发人员。坏消息是,这个异常实际上是由Perl引发的,但必须以某种方式升级到操作系统级别。 – innaM 2008-12-10 10:07:16

0

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

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

总之,设置 HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \控制\的Windows \ ErrorMode 注册表项值“2“。