¿Cómo puedo evitar que Windows capture mis excepciones de Perl?

votos
4

Tengo este software de Perl que se supone que funciona 24/7. Mantiene abierta una conexión con un servidor IMAP, comprueba si hay correo nuevo y luego clasifica los mensajes nuevos.

Ahora tengo un usuario que está hibernando su computadora portátil XP de vez en cuando. Cuando esto sucede, la conexión al servidor falla y se activa una excepción. El código de llamada generalmente detecta esa excepción e intenta reconectarse. Pero en este caso, parece que Windows (¿o Perl?) Está atrapando la excepción y entregándola al usuario a través de un cuadro de mensaje.

Alguien sabe cómo puedo evitar ese tipo de wtf? ¿Podría mi código detectar una señal del tipo el sistema está a punto de hibernar?

Para aclarar algunos puntos que ya planteaste:

  • No tengo problemas con los usuarios que hibernan sus máquinas. Solo necesito encontrar una manera de lidiar con eso.
  • El módulo de Perl en cuestión arroja una excepción. Hace algo así como die 'foo bar'. Aunque la aplicación está completamente basada en el navegador y no utiliza nada como Wx o Tk, el usuario obtiene un cuadro de mensaje titulado poll_timer . El contenido de ese cuadro de mensaje es exactamente el contenido de $ @ ('foo bar' en este ejemplo).
  • La aplicación se compila en un ejecutable usando perlapp . Sin embargo, la documentación no menciona nada sobre el manejo de excepciones.
Publicado el 09/12/2008 a las 15:22
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
1

Creo que estás tratando con una excepción de nivel de sistema operativo, no algo lanzado desde Perl. El módulo de Perl relevante está haciendo una llamada a algo en un archivo DLL (supongo), y se lanza la excepción. Su mejor opción sería reducir esto a un caso de prueba simple y replicable que desencadena la excepción (es posible que tenga que hibernar mucho y despertar a las máquinas involucradas para este proceso). Luego, envíe esta información al desarrollador del módulo y pregúnteles si pueden encontrar un medio para detectar esta excepción de una manera que sea más útil para usted.

Si el desarrollador del módulo no puede o no quiere ayudar, entonces probablemente terminará necesitando usar el depurador de Perl para depurar el código del módulo y ver exactamente qué está sucediendo, y ver si hay alguna manera de cambiarlo. el módulo usted mismo para atrapar y lidiar con la excepción.

Respondida el 09/12/2008 a las 18:42
fuente por usuario

votos
0

Encontré un truco para evitar los cuadros de diálogo del sistema modal para los errores difíciles (por ejemplo, "encontrado y excepción y debe cerrarse"). No sé si el mismo truco funcionará para este tipo de error que está describiendo, pero podría intentarlo.

Ver: evitar el diálogo "se encontró un problema y debe cerrarse" en Windows

En resumen, establezca la clave de registro HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Windows \ ErrorMode en el valor "2".

Respondida el 09/12/2008 a las 19:10
fuente por usuario

votos
0

Es difícil ofrecer sugerencias inteligentes sin ver fragmentos de código relevantes. Si obtiene un cuadro de diálogo con un mensaje de excepción, es muy probable que el programa utilice la biblioteca Tk o wxPerl GUI, lo que puede complicar un poco las cosas. Dicho esto, supongo que sería bastante fácil modificar el manejo de excepciones en el programa envolviendo el punto de falla en un bloque eval y probando $ @ después de la llamada. Si $ @ contiene un mensaje de error que indica una falla en la conexión, restablezca la conexión y siga su camino.

Respondida el 09/12/2008 a las 16:03
fuente por usuario

votos
0

Tu usuario no es la excepción, sino la regla. Mi computadora portátil está hibernada entre el trabajo y el hogar. En el trabajo, está encendido en la red DHCP; en casa, está en otro completamente. La mayoría de los programas continúan funcionando a pesar de una confusa multiplicidad de direcciones IP (VMWare, VPN, conexión anterior simple a través del enrutador NAT). Aquellos que no (AT & T Net Client, para VPN - no utilizados en la oficina, necesarios en casa o en la carretera) reconocen la desconexión en el momento de hibernación (AT & T Net Client mantiene el proceso StandBy / Hibernate hasta que se desconecta), y restablezco la conexión si es apropiado cuando la máquina se despierta. En los aeropuertos, utilizo el WiFi local (más DHCP) pero apago completamente el inalámbrico (un interruptor físico) antes de subir al avión.

Por lo tanto, debe averiguar cómo saber si la máquina pasará al modo de Suspensión o Hibernación para que su software sea utilizable. Lo que no tengo, lamento decirlo, es una receta para lo que debes hacer.

Algunos trabajos con Google sugieren que ACPI (Configuración avanzada e interfaz de alimentación) es parte de la solución ( Microsoft ). APM (Advanced Power Management) también puede ser relevante.

Respondida el 09/12/2008 a las 15:58
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more