Cómo mostrar errores al usuario al tiempo que registrarlo?
-
21-08-2019 - |
Pregunta
Estoy usando una interfaz de usuario PyQt4. He vuelto a dirigir stderr a un archivo de registro para facilitar la depuración y solución de problemas, pero ahora tengo que mostrar mensajes de error al usuario cuando se produce un error.
Mi problema es que necesito para capturar una excepción cuando se presente y que el usuario sepa que pasó, pero todavía dejar que el rastreo se propagan a stderr (es decir, el archivo de registro).
Si hago algo como esto:
def updateResults(self):
try:
#code that updates the results
except:
#display error message box
Esto detectar la excepción y no propagar el registro de errores.
¿Hay alguna manera de mostrar al usuario el mensaje y luego continuar a propagar el error?
Que este trabajo?
except, e:
#display error message box
raise e
¿Hay una mejor manera de lograr mi objetivo?
Solución
Creo que usted está pensando acerca de esto en el camino equivocado. No se debe volver a elevar el error simplemente para entrar más a fondo en la línea. La forma canónica de hacer esto en Python es usar el módulo de registro. Adaptado de la documentación:
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)
Esto da un sistema de registro mucho más flexible que depender de errores producidos en sys.stdout. Es posible que no tenga que volver a plantear la excepción si se puede recuperar de la excepción de alguna manera.
Otros consejos
Exactamente, pero puede simplemente
raise
que volverá a plantear la excepción actualmente manejado.
Algunas informaciones adicionales:
(Con PyQt4) también tendrá que volver a enlazar sys.excepthook a su propia función de atrapar todos los no capturadas excepciones. De lo contrario PyQt sólo les va a imprimir en la consola, que puede no ser lo que necesita ...
import sys
def excepthook(exc_type, exc_val, tracebackobj):
# do something useful with the uncaught exception
...
def main():
# rebind excepthook
sys.excepthook = excepthook
...