2

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

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

ответ

6

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

+0

Я определенно буду использовать этот метод для будущих проектов. Прямо сейчас py2exe выполняет переадресацию 'stderr', поэтому, если я не реорганизую свой код на наличие исключающих блоков вокруг * каждой функции, я получаю два файла журнала (пойманные и не обнаруженные исключения). – tgray

+0

В принципе, преимущество реализации этого метода не стоит времени рефакторинга для * этого * проекта. – tgray

+0

Имейте в виду (tgray), что вы хотите выделить свои пойманные/неперехваченные исключения. Схема протоколирования, описанная Ant, является лучшей, поскольку вы можете регистрироваться в файле или регистрироваться в базе данных или даже вносить в файл AND базу данных, и вам не нужно менять код в каждом месте. – DevinB

3

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

raise 

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

1

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

(С 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 
    ... 
+0

На самом деле py2exe обрабатывает это автоматически, создавая файл «program.exe.log». – tgray

+0

Но хорошо знать, когда я пишу приложение, которое не связано с py2exe. – tgray