4

私は、24 時間 365 日稼働する Perl ソフトウェアを持っています。IMAP サーバーへの接続を開いたままにし、新しいメールをチェックしてから、新しいメッセージを分類します。

現在、XPラップトップを時々休止状態にしているユーザーがいます。これが発生すると、サーバーへの接続が失敗し、例外がトリガーされます。通常、呼び出し元のコードはその例外をキャッチし、再接続を試みます。しかし、この場合、Windows (または Perl?) が例外をキャッチし、メッセージ ボックスを介してユーザーに配信しているようです。

そのようなwtfを防ぐ方法を知っている人はいますか?私のコードは「システムが休止状態になりそうです」というシグナルをキャッチできますか?

すでに提起したいくつかのポイントをクリアするには:

  • ユーザーがマシンを休止状態にすることに問題はありません。それに対処する方法を見つける必要があります。
  • 問題の Perl モジュールは例外をスローします。アプリケーションは完全にブラウザ ベースで、Wx や Tk などは使用しませんが、ユーザーは「poll_timer」というタイトルのメッセージ ボックスを受け取ります。そのメッセージ ボックスの内容はまさにその内容です。 $@ の (この例では 'foo bar')。
  • アプリケーションは、perlappを使用して実行可能ファイルにコンパイルされます。ただし、ドキュメントには例外処理については何も言及されていません。
4

4 に答える 4

1

Perl からスローされたものではなく、OS レベルの例外を扱っていると思います。関連する Perl モジュールが DLL 内の何かを呼び出しており (おそらく)、例外がスローされています。最善の策は、これを単純で再現可能なテスト ケースに要約して、例外をトリガーすることです (このプロセスに関係するマシンを何度も休止状態にして復帰させる必要がある場合があります)。次に、この情報をモジュール開発者に送信し、より便利な方法でこの例外をキャッチする手段を見つけられるかどうか尋ねます。

モジュール開発者が助けにならない、または助けようとしない場合は、Perl デバッガーを使用してモジュールのコードをデバッグし、何が起こっているかを正確に確認し、変更できる方法があるかどうかを確認する必要があります。モジュールを自分でキャッチして例外を処理します。

于 2008-12-09T17:42:06.270 に答える
0

ユーザーは例外ではなく、ルールです。私のラップトップは仕事と家庭の間で休止状態になっています。職場では、DHCPネットワーク上にあります。家では、それはまったく別のものです。ほとんどのプログラムは、複雑なIPアドレス(VMWare、VPN、NATルーターを介した従来の接続)が混乱しているにもかかわらず、引き続き機能します。そうでないもの(AT&T Net Client、VPNの場合-オフィスでは使用されていない、自宅や外出先で必要)は休止時に切断を認識します(AT&T Net Clientは、切断されるまでStandBy / Hibernateプロセスを保留します)、マシンがウェイクアップしたときに、必要に応じて接続を再確立します。空港では、ローカルWiFi(より多くのDHCP)を使用しますが、飛行機に搭乗する前にワイヤレスを完全にオフにします(1つの物理スイッチ)。

したがって、ソフトウェアを使用できるようにするには、マシンがスタンバイモードまたはハイバネーションモードになっていることを知る方法を見つける必要があります。申し訳ありませんが、私が持っていないのは、あなたがしなければならないことのレシピです。

Googleとの協力により、ACPI(Advanced Configuration and Power Interface)がソリューションの一部であることが示唆されています(Microsoft)。APM(Advanced Power Management)も関連している可能性があります。

于 2008-12-09T14:58:40.483 に答える
0

ハード エラー (例: 「遭遇して例外が発生し、閉じる必要があります」) のモーダル システム ダイアログ ボックスを回避するためのハックを見つけました。あなたが説明しているこの種のエラーに対して同じトリックが機能するかどうかはわかりませんが、試してみてください。

参照: Windows で「問題が発生したため、閉じる必要があります」ダイアログを回避する

つまり、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode レジストリ キーを値「2」に設定します。

于 2008-12-09T18:10:31.890 に答える
0

関連するコードの一部を確認せずに、インテリジェントな提案を提供することは困難です。ダイアログ ボックスに例外メッセージが表示される場合、プログラムはTkまたはwxPerl GUI ライブラリのいずれかを使用している可能性が高く、状況が少し複雑になる可能性があります。そうは言っても、失敗ポイントを eval ブロッ​​クでラップし、呼び出し後に $@ をテストすることで、プログラムの例外処理を変更するのはかなり簡単だと思います。$@ に接続失敗を示すエラー メッセージが含まれている場合は、接続を再確立して先に進みます。

于 2008-12-09T15:03:15.280 に答える