Pergunta

Eu estou usando uma interface de usuário PyQt4. Eu redirecionado stderr para um arquivo de log para facilitar a depuração e resolução de problemas, mas agora eu preciso para exibir mensagens de erro para o usuário quando ocorre um erro.

Meu problema é que eu preciso para capturar uma exceção quando isso acontece e deixar o know usuário que isso aconteceu, mas ainda deixar a propagar traceback para stderr (ou seja, o arquivo de log).

Se eu fizer algo como isto:

def updateResults(self):
    try:
        #code that updates the results
    except:
        #display error message box

Isso irá capturar a exceção e não propagar para o log de erro.

Existe alguma maneira de mostrar ao usuário a mensagem e, em seguida, continuar a propagar o erro?

Será que isso funciona?

except, e:
    #display error message box
    raise e

Existe uma maneira melhor para realizar meu objetivo?

Foi útil?

Solução

Eu acho que você está pensando sobre isso da maneira errada. Você não deve ser re-elevar o erro simplesmente para registrá-lo ainda mais para baixo da linha. A maneira canônico de fazer isso em Python é usar o módulo de registro. Adaptado de docs:

import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG,)

...

try:
    # code
except:
    logging.debug('Something bad happened', exc_info=True)
    # display message box
    # raise (if necessary)

Isto dá um sistema de registro muito mais flexível do que depender de erros produzidos na sys.stdout. Você pode não precisar de re-raise a exceção se você pode recuperar a exceção de alguma forma.

Outras dicas

exatamente, mas você pode apenas

raise

que irá re-raise a exceção atualmente tratadas.

Algumas informações adicionais:

(Com PyQt4) você também vai precisar para religar sys.excepthook a sua própria função para pegar todos os uncaught exceções. Caso contrário PyQt só vai imprimi-los para o console, que pode não ser o que você precisa ...

import sys

def excepthook(exc_type, exc_val, tracebackobj):
    # do something useful with the uncaught exception
    ...

def main():
    # rebind excepthook
    sys.excepthook = excepthook
    ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top