Como posso impedir que o Windows de captura meus exceções Perl?

votos
4

Eu tenho esse software Perl que é suposto para executar 24/7. Ele mantém abrir uma conexão com um servidor IMAP, verifica novas mensagens e, em seguida, classifica novas mensagens.

Agora eu tenho um usuário que está hibernando seu laptop XP de vez em quando. Quando isso acontece, a conexão com o servidor falhar e uma exceção é acionada. O código de chamada normalmente pega essa exceção e tenta se reconectar. Mas, neste caso, parece que o Windows (ou Perl?) Está pegando a exceção e entregá-lo ao usuário através de uma caixa de mensagem.

Alguém sabe como posso evitar que esse tipo de wtf? Poderia meu código captura um sistema-é-sobre-a-hibernação sinal?

Para esclarecer alguns pontos já levantados:

  • Não tenho nenhum problema com os usuários hibernando suas máquinas. Eu só preciso encontrar uma maneira de lidar com isso.
  • O módulo Perl em questão faz lançar uma exceção. Ele faz algo como morrer 'foo bar'. Embora a aplicação é completamente baseada em navegador e não usa qualquer coisa como Wx ou Tk, o usuário recebe uma caixa de mensagem intitulada 'poll_timer'. O conteúdo dessa caixa de mensagem é exatamente o conteúdo de US $ @ ( 'bar foo' neste exemplo).
  • A aplicação é compilado em um executável usando perlapp . A documentação não menciona nada sobre a manipulação de exceção, no entanto.
Publicado 09/12/2008 em 15:22
fonte usuário
Em outras línguas...                            


4 respostas

votos
1

Eu acho que você está lidando com uma exceção de nível OS, não é algo lançada a partir de Perl. O módulo Perl relevante é fazer uma chamada para algo em uma DLL (presumo), e a exceção é ser jogado. Sua melhor aposta seria a ferver esse baixo para um caso de teste simples, replicável que desencadeia a exceção (você pode ter que fazer um monte de hibernação e acordar as máquinas envolvidas para este processo). Em seguida, enviar essa informação para o desenvolvedor do módulo e perguntar-lhes se eles podem chegar a um meio de capturar essa exceção de uma forma que é mais útil para você.

Se o desenvolvedor do módulo não podem ou não ajudar, então você provavelmente vai acabar precisando usar o depurador Perl para depurar em código do módulo e ver exatamente o que está acontecendo, e ver se há uma maneira você pode mudar o módulo-se para capturar e lidar com a exceção.

Respondeu 09/12/2008 em 18:42
fonte usuário

votos
0

Eu encontrei um hack para evitar caixas de diálogo do sistema modal para erros do disco (por exemplo, "encontrado e exceção e precisa ser fechado"). Eu não sei se o mesmo truque irá funcionar para esse tipo de erro que você está descrevendo, mas você poderia dar-lhe uma tentativa.

Veja: Evitando o “encontrou um problema e precisa ser fechado” de diálogo no Windows

Em suma, definir o HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Windows \ ErrorMode chave de registo para o valor “2".

Respondeu 09/12/2008 em 19:10
fonte usuário

votos
0

É difícil oferecer sugestões inteligentes sem ver pedaços relevantes de código. Se você está recebendo uma caixa de diálogo com uma mensagem de exceção que o programa é mais provável usando o Tk ou wxPerl biblioteca GUI, o que pode complicar as coisas um pouco. Com isso dito, o meu palpite é que seria muito fácil de modificar o tratamento de exceção no programa envolvendo o ponto de falha em um bloco de eval e testando $ @ após a chamada. Se $ @ contém uma mensagem de erro indicando falha de conexão, em seguida, re-estabelecer a conexão e ir em seu caminho.

Respondeu 09/12/2008 em 16:03
fonte usuário

votos
0

Seu usuário não é a exceção, mas sim a regra. Meu laptop está hibernado entre trabalho e casa. No trabalho, é sobre a rede DHCP; em casa, é em outro completamente. A maioria dos programas continuam a trabalhar apesar de uma multiplicidade confusa de endereços IP (VMWare, VPN, conexão planície antiga via roteador NAT). Aqueles que não o fazem (AT & T cliente Net, para o VPN - não utilizado no escritório, necessário em casa ou na estrada) reconhecer a desconexão em tempo de hibernação (AT & T cliente Net mantém-se o processo de espera / Hibernate até que foi desligado), e eu re-estabelecer a conexão se for o caso, quando a máquina acorda. Nos aeroportos, eu uso o WiFi local (mais DHCP), mas virada do wireless completamente (um interruptor físico) antes de embarcar no avião.

Então, você precisa descobrir como aprender que a máquina está entrando em modo de espera ou de hibernação para o seu software para ser utilizável. O que eu não tenho, eu lamento dizer, é uma receita para o que você precisa fazer.

Alguns trabalham com o Google sugere que ACPI (Advanced Configuration and Power Interface) é parte da solução ( Microsoft ). APM (Advanced Power Management) também podem ser relevantes.

Respondeu 09/12/2008 em 15:58
fonte usuário

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