Как я могу запретить Windows перехватывать мои исключения Perl? - PullRequest
4 голосов
/ 09 декабря 2008

У меня есть это программное обеспечение Perl, которое должно работать 24/7. Он сохраняет соединение с сервером IMAP, проверяет наличие новой почты и затем классифицирует новые сообщения.

Теперь у меня есть пользователь, который время от времени переводит свой ноутбук в спящий режим. Когда это происходит, соединение с сервером прерывается, и запускается исключение. Код вызова обычно перехватывает это исключение и пытается восстановить соединение. Но в этом случае кажется, что Windows (или Perl?) Перехватывает исключение и доставляет его пользователю через окно сообщения.

Кто-нибудь знает, как я могу предотвратить такого рода ВТФ? Может ли мой код перехватить сигнал "система приближается к гибернации"?

Чтобы прояснить некоторые моменты, которые вы уже подняли:

  • У меня нет проблем с пользователями, спящими на своих машинах. Мне просто нужно найти способ справиться с этим.
  • Рассматриваемый модуль Perl вызывает исключение. Он делает что-то вроде "die 'foo bar". Хотя приложение полностью основано на браузере и не использует ничего подобного Wx или Tk, пользователь получает окно сообщения с именем "poll_timer". Содержимое этого окна сообщения является точно содержимым $ @ ('foo bar' в этом примере).
  • Приложение компилируется в исполняемый файл с использованием perlapp . Однако в документации ничего не говорится об обработке исключений.

Ответы [ 4 ]

1 голос
/ 09 декабря 2008

Я думаю, что вы имеете дело с исключением на уровне ОС, а не с Perl. Соответствующий модуль Perl выполняет вызов чего-либо в DLL (я полагаю), и возникает исключение. Лучше всего было бы свести это к простому, воспроизводимому тестовому сценарию, который вызывает исключение (вам, возможно, придется сделать много спящих и разбудить машины, задействованные в этом процессе). Затем отправьте эту информацию разработчику модуля и спросите его, могут ли они найти способ перехватить это исключение более удобным для вас способом.

Если разработчик модуля не может или не может помочь, то вам, вероятно, придется использовать отладчик Perl для отладки в коде модуля и посмотреть, что именно происходит, и посмотреть, есть ли способ Вы можете изменить модуль самостоятельно, чтобы поймать и справиться с исключением.

0 голосов
/ 09 декабря 2008

Я нашел хак, чтобы избежать диалоговых окон модальной системы из-за серьезных ошибок (например, «встречаются, исключение и нужно закрыть»). Я не знаю, подойдет ли тот же трюк для описываемой вами ошибки, но вы могли бы попробовать.

См .: Как избежать диалогового окна «возникла проблема и необходимо закрыть» в Windows

Короче, установите HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Windows \ ErrorMode ключ реестра со значением «2».

0 голосов
/ 09 декабря 2008

Трудно предлагать разумные предложения, не видя соответствующих фрагментов кода. Если вы получаете диалоговое окно с сообщением об исключении, программа, скорее всего, использует библиотеку Tk или wxPerl GUI, что может немного усложнить ситуацию. С учетом сказанного, я думаю, что было бы довольно легко изменить обработку исключений в программе, поместив точку отказа в блок eval и протестировав $ @ после вызова. Если $ @ содержит сообщение об ошибке, указывающее на сбой соединения, восстановите соединение и продолжайте.

0 голосов
/ 09 декабря 2008

Ваш пользователь не исключение, а правило. Мой ноутбук находится в спящем режиме между работой и домом. На работе он включен в сети DHCP; дома это совсем по другому. Большинство программ продолжают работать, несмотря на запутанную множественность IP-адресов (VMWare, VPN, обычное старое соединение через маршрутизатор NAT). Те, кто не (AT & T Net Client, для VPN - не используется в офисе, необходим дома или в дороге), распознают разъединение во время спящего режима (AT & T Net Client задерживает процесс StandBy / Hibernate до тех пор, пока он не отключится), и я восстанавливаю соединение, если это необходимо, когда машина просыпается. В аэропортах перед посадкой в ​​самолет я использую локальный WiFi (больше DHCP), но полностью выключаю беспроводной (один физический коммутатор).

Итак, вам нужно узнать, как узнать, что аппарат переходит в режим StandBy или режим гибернации, чтобы ваше программное обеспечение можно было использовать. Извините, что у меня нет рецепта того, что вам нужно делать.

Некоторая работа с Google предполагает, что ACPI (Advanced Configuration и Power Interface) является частью решения ( Microsoft ). APM (Advanced Power Management) также может иметь значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...