Domanda

Io sto usando un'interfaccia utente PyQt4. Ho reindirizzato stderr in un file di log per facilitare il debug e la risoluzione dei problemi, ma ora ho bisogno di visualizzare i messaggi di errore per l'utente in caso di errore.

Il mio problema è che ho bisogno di rilevare un'eccezione quando succede e consentire all'utente di sapere che è successo, ma ancora lasciare che il traceback propagare a stderr (vale a dire il file di log).

Se faccio qualcosa di simile:

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

In questo modo intercettare l'eccezione e non propagare nel log degli errori.

C'è qualche modo per mostrare all'utente il messaggio e poi continuare a propagare l'errore?

Sarebbe questo lavoro?

except, e:
    #display error message box
    raise e

C'è un modo migliore per raggiungere il mio obiettivo?

È stato utile?

Soluzione

Penso che si sta pensando di questo nel modo sbagliato. Non si dovrebbe essere ri-sollevare l'errore è sufficiente effettuare il login è più in basso la linea. Il modo cannonical di fare questo in Python è quello di utilizzare il modulo di registrazione. Adattato dalla documentazione:

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)

Questo dà un sistema di registrazione molto più flessibile che fare affidamento su errori prodotti su sys.stdout. Potrebbe non essere necessario per rilanciare l'eccezione se si può recuperare da l'eccezione in qualche modo.

Altri suggerimenti

esattamente, ma si può solo

raise

, che si ri-sollevare l'eccezione attualmente gestita.

Alcune informazioni aggiuntive:

(Con PyQt4) avrete anche bisogno di associare nuovamente sys.excepthook per la propria funzione per catturare tutti non rilevati eccezioni. In caso contrario, sarà solo PyQt stamparle alla console, che non può essere quello che ti serve ...

import sys

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

def main():
    # rebind excepthook
    sys.excepthook = excepthook
    ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top