Как отобразить ошибки для пользователя, все еще регистрируя его?


Я использую пользовательский интерфейс 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 2

3 ответа:

Я думаю, что вы думаете об этом неправильно. Вы не должны повторно вызывать ошибку просто для того, чтобы записать ее дальше по строке. Канонический способ сделать это в 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.стандартный вывод. Возможно, Вам не потребуется повторно вызывать исключение, если вы можете каким-то образом восстановить его.

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

raise

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

Некоторые дополнительные сведения:

(с 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
    ...