Como mostrar os erros para o usuário enquanto ainda registrá-lo?
-
21-08-2019 - |
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?
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
...