Как отобразить ошибки для пользователя, все еще регистрируя его? - PullRequest
2 голосов
/ 23 марта 2009

Я использую пользовательский интерфейс PyQt4. Я перенаправил stderr в файл журнала для упрощения отладки и устранения неполадок, но теперь мне нужно отображать сообщения об ошибках пользователю при возникновении ошибки.

Моя проблема заключается в том, что мне нужно перехватить исключение, когда оно происходит, и сообщить пользователю, что это произошло, но все же позволить трассировке распространяться на stderr (то есть файл журнала).

Если я сделаю что-то вроде этого:

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

Это перехватит исключение и не распространится на журнал ошибок.

Есть ли какой-нибудь способ показать пользователю сообщение и затем продолжить распространение ошибки?

Будет ли это работать?

except, e:
    #display error message box
    raise e

Есть ли лучший способ достичь моей цели?

Ответы [ 3 ]

6 голосов
/ 23 марта 2009

Я думаю, вы думаете об этом неправильно. Вы не должны повторно вызывать ошибку, просто чтобы записать ее дальше. Канонический способ сделать это в Python - использовать модуль регистрации. Адаптировано из документов:

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)

Это дает гораздо более гибкую систему регистрации, чем полагаться на ошибки, возникающие в sys.stdout. Вам может не понадобиться повторно вызывать исключение, если вы можете каким-то образом восстановить его.

3 голосов
/ 23 марта 2009

Точно, но вы можете просто

raise

, который повторно вызовет обработанное в настоящий момент исключение.

1 голос
/ 23 марта 2009

Некоторая дополнительная информация:

(с PyQt4) вам также нужно перепривязать sys.excepthook к вашей собственной функции, чтобы перехватить все необработанные исключения. В противном случае PyQt просто выведет их на консоль, что может оказаться не тем, что вам нужно ...

import sys

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

def main():
    # rebind excepthook
    sys.excepthook = excepthook
    ...
...