【问题标题】:How to display errors to the user while still logging it?如何在仍然记录错误的同时向用户显示错误?
【发布时间】:2009-03-23 16:22:51
【问题描述】:

我正在使用 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

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

【问题讨论】:

    标签: python exception-handling error-handling pyqt4 error-logging


    【解决方案1】:

    我认为你以错误的方式思考这个问题。您不应该仅仅为了进一步记录错误而重新提出错误。在 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 产生的错误更灵活的日志记录系统。如果您可以通过某种方式从异常中恢复,您可能不需要重新引发异常。

    【讨论】:

    • 我肯定会在以后的项目中使用这种方法。现在 py2exe 正在做stderr 的重定向,所以除非我重构我的代码以在 every 函数周围有 try-except 块,否则我最终会得到两个日志文件(捕获和未捕获的异常)。
    • 基本上,实现此方法的好处不值得为 this 项目花费重构时间。
    • 请记住 (tgray),您确实希望将捕获/未捕获的异常区分开来。 Ant 描述的日志模式是最好的,因为您可以记录到文件,或记录到数据库,甚至可以记录到文件和数据库,而且您不必在每个地方都更改代码。
    • 另外,因为 'catch' 块非常昂贵(或 Python 中的 'except'),你不想为了记录它们而引发异常,你应该只在你的方法有走到了死胡同。如果它没有到达死胡同,你应该记录它,然后优雅地继续或退出。
    • 正式注明。感谢您的意见。
    【解决方案2】:

    没错,但你可以这样做

    raise
    

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

    【讨论】:

      【解决方案3】:

      一些附加信息:

      (使用 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
          ...
      

      【讨论】:

      • 实际上,py2exe 会自动创建一个“program.exe.log”文件。
      • 但很高兴知道我是否曾经编写过未与 py2exe 捆绑的应用程序。
      猜你喜欢
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多