Pergunta

Eu tenho aplicação GUI complexo escrito em Python e wxPython.

Eu quero que ela seja certificada para o Windows Vista, por isso tem de funcionar de uma maneira que faz com diálogo Relatório de erros do Windows (aquele que pede " Você deseja enviar relatório para a Microsoft? " ) aparecer. Isso é relevante para caso de teste no 32 de " Certificado para casos de teste do Windows Vista " documento.

Infelizmente, quando eu bater meu aplicativo com a ferramenta ThreadHijacker wxPython mensagem mostra como:

Unhandled exception
---------------------------
An unhandled exception occurred. Press "Abort" to terminate the program,
"Retry" to exit the program normally and "Ignore" to try to continue.
---------------------------
Abort   Retry   Ignore

Como posso evitar que wxPython mostrando esta mensagem? Eu tenho sys.excepthook costume, mas parece que este diálogo é mostrada antes da minha, exceto gancho pode interferir.

EDIT:

docs diz que wxAppConsole :: OnExceptionInMainLoop é chamado e sob MSW ele exibe alguns de diálogo de fantasia que permite ao usuário escolher entre as diferentes opções. Parece no entanto, que wxPython não permite sobrecarregar essa função ... Alguém sabe como mudar o comportamento padrão do wxAppConsole :: OnExceptionInMainLoop em wxPython?
Eu prefiro soluções que estão no nível Python sobre aqueles que entram em C / C ++

EDIT2:

Ao todo, eu perguntei na lista wxPython, e Robin Dunn respondeu que ele vai olhar para fazer wxAppConsole :: OnExceptionInMainLoop substituível em próximas versões do wxPython. Desde que eu não podia esperar, eu tive que compilar minha própria versão do wxPython que não inclui essa função. Descobriu-se que a presença de wxAppConsole :: OnExceptionInMainLoop função pode ser ativado / desativado pelo ajuste apropriado dos sinalizadores de compilação.

Foi útil?

Solução

Tudo acabou com a compilação de meus próprios wxWidgets e wxPython, com bandeira apenas uma compilação mudou:. wxUSE_EXCEPTIONS deve ser definido para 0

Robin Dunn escreveu que ele vai tentar corrigir wxPython, de modo que este comportamento pode ser modificado sem recompilar de toda a biblioteca.

Outras dicas

Se bem me lembro, este é um catch (...) a nível superior (wxApp) em wxWidgets. Você pode usar uma exceção vectored Handler ou _set_se_translator () para obter um primeiro tiro no exceção estruturada, e saída para WER, ou seja ReportFault () de lá.

É possível que você simplesmente pega tudo? Você teria que, eu acho, colocar um try: except: bloco em torno de cada método vinculado a um widget. Você poderia escrever um decorador:

def catch_exception(f):
    def safe(*args, **kw):
        try:
            f(*args, **kw)
        except Exception, e:
            handle_exception(e)
    return safe

def handle_exception(e):
    # do Vista stuff
    sys.exit()

Em seguida, decorar qualquer função que poderia ser chamado pelo mainloop (desde que eu presumo que é onde wxPython faz sua própria captura).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top