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?

¿Fue útil?

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
    ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top