我很难让它正常工作(显然) - 我快到了,而且我很清楚为什么它不起作用 - 只是不知道如何让它工作。
这假设尝试将文件读入内存,如果失败,则会转到代码块的“例外”子句(该部分是“duh”)。错误文件打印:“<main.DebugOutput 实例位于 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): "
首先,您应该使用日志库。它将帮助您处理不同的日志记录级别(信息/警告/错误)、时间戳等。
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]
来获取错误详细信息。
问题就在这里:
myStdError = str(sys.stderr)
myFileErr.write(myStdError)
sys.stderr 是 POSIX 标准中定义的类似文件的接口,称为 标准错误,而不是可以写入文件的“错误文本”。所以你(可能)想做的是:
sys.stderr = myFileErr
这是相当于 Unix shell 中的
python your_python_sctipt.py 2> PIDErrorLog.txt
的 python。
使用日志记录模块。日志记录模块具有异常格式化程序,可以帮助您以漂亮的方式打印异常。
就像 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()
Alison的回答也很好,写得很好。
这会将控制台中的所有错误记录到 txt 文件中。每次运行脚本时,它都会清除以前的错误并从头开始。如果要保存以前的错误,请将“w”更改为“a”。放在代码的最开头:
import sys
with open('./errors.txt', 'w') as file5:
file5.write('')
file5.close()
sys.stderr = open("./errors.txt", "a")