2008-12-09 24 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「。