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