【问题标题】:Writing Pythons Errors to a txt file将 Python 错误写入 txt 文件
【发布时间】:2010-01-25 19:58:01
【问题描述】:

我无法让它正常工作(显然) - 我几乎在那里,我很清楚为什么它不工作 - 只是不知道如何让它工作。

这是假设尝试将文件读入内存,如果失败,它会转到代码块的“except”子句(那部分是“duh”)。错误文件打印:“ma​​in.DebugOutput instance at 0x04021EB8>”。我想要它做的是打印实际的错误。就像 FileIOError 或 TraceBackError 或该错误文件的任何内容。这只是开始阶段,我计划添加诸如日期戳之类的内容并将其附加,而不是写入/创建 - 我只需要将实际错误打印到文件中。建议?

import os, sys

try:
    myPidFile = "Zeznadata.txt"
    myOpenPID_File = open(myPidFile, "r") #Attempts to open the file
    print "Sucessfully opened the file: \"" + myPidFile + "\"."

except:
    print "This file, \"" + myPidFile + "\", does not exist.  Please check the file name and try again.  "
    myFileErr = open("PIDErrorlog.txt", "w")
    myStdError = str(sys.stderr)
    myFileErr.write(myStdError)
    myFileErr.close()
    print "\nThis error was logged in the file (and stored in the directory): "

【问题讨论】:

  • python 中没有 TraceBackError 这样的东西(除非你定义它)。当出现错误时,会打印出堆栈跟踪。
  • 日志记录是最好的方法,而且处理个别异常要好得多。

标签: python error-handling


【解决方案1】:

首先,您应该使用日志库。它将帮助您处理不同的日志记录级别(信息/警告/错误)、时间戳等。

http://docs.python.org/library/logging.html

其次,您需要捕获错误,然后您可以记录有关它的详细信息。此示例来自 Python 文档。

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())

except IOError as (errno, strerror):
    print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
    print "Could not convert data to an integer."
except:
    print "Unexpected error:", sys.exc_info()[0]
    raise

看看它如何捕获 IOError 并将错误号和错误消息分配给变量?您可以为要处理的每种错误类型设置一个 except 块。在最后一个(通用错误)块中,它使用sys.exc_info()[0] 来获取错误详细信息。

http://docs.python.org/tutorial/errors.html

【讨论】:

  • +1 用于日志库,(对于多个 except s 会再提供 +1)
  • 太棒了 - 感谢您的惊人回复。我已经开始阅读有关此模块/库的信息,并且到目前为止已成功使用它(仍然存在一些问题,但我认为我可以很好地“磨”它以使其正常工作。谢谢!- j
  • 如果您将此作为新问题发布,您将获得最佳回复,并向我们展示您的更多脚本。但除此之外,听起来您正在经历预期的行为。您通常不希望在正在运行的进程下编辑或移出日志文件。日志文件通常是某种存档。如果您需要在此脚本的正常工作流程中编辑/删除文件,那么将其视为日志文件可能不是正确的方法。同样,如果没有更多信息,很难知道。
  • 我实际上想通了:我只需要在最后添加 file.close() 就可以了!感谢您对单独问题的想法(不确定这是否符合犹太教规)。
【解决方案2】:

问题出在这里:

 myStdError = str(sys.stderr)
 myFileErr.write(myStdError)

sys.stderr 是 POSIX 标准中定义的类似文件的接口,称为standard error,而不是您可以写入文件的“错误文本”。所以你(可能)想要做的是:

sys.stderr = myFileErr

这是与 unix shell 中的python your_python_sctipt.py 2> PIDErrorLog.txt 等效的python。

【讨论】:

    【解决方案3】:

    使用日志模块。日志记录模块具有异常格式化程序,可以帮助您以漂亮的方式打印异常。

    http://docs.python.org/library/logging.html

    【讨论】:

      【解决方案4】:

      就像 Kimvais 所说,您的问题是:

      myStdError = str(sys.stderr)
      myFileErr.write(myStdError)
      

      sys.stderr 是 stderr 的文件句柄(stdout 是 print 写入的内容)。

      你应该这样做:

      try:
          ...open file...
      except IOError as (errno, strerror):
          ...open errfile...
          errfile.write(strerror)
          errfile.close()
      

      艾莉森的回答也很好,写的很好。

      【讨论】:

        猜你喜欢
        • 2016-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        • 2018-01-05
        • 2015-01-21
        • 2011-05-06
        相关资源
        最近更新 更多