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

有没有更好的方法来实现我的目标?

4

3 回答 3

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 产生的错误更灵活的日志系统。如果您可以通过某种方式从异常中恢复,则可能不需要重新引发异常。

于 2009-03-23T16:41:55.253 回答
3

没错,但你可以

raise

这将重新引发当前处理的异常。

于 2009-03-23T16:24:38.150 回答
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
    ...
于 2009-03-23T19:27:35.277 回答