2010-01-25 83 views
1

我無法得到這個工作正常(顯然) - 我幾乎沒有和我有它爲什麼不工作的一個好主意 - 只是不知道如何使它發揮作用。寫作蟒蛇錯誤到一個txt文件

這是假設試圖文件讀入存儲器中,如果失敗,轉移到「除」的代碼塊的條款(這部分是「咄」)。錯誤文件打印:「< main .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): " 
+0

有作爲Python中的TraceBackError沒有這樣的事情(除非你把它定義)。出現錯誤時,堆棧跟蹤將被打印出來。 – stefanw 2010-01-25 20:02:25

+0

日誌記錄答案是去的最佳途徑,再加上處理個別例外要好得多。 – Finglas 2010-01-25 20:19:06

回答

7

首先,您應該使用日誌記錄庫。它將幫助你處理不同的日誌級別(信息/警告/錯誤),時間戳等等。

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

用於日誌庫的+1,(除了s之外,會給出多個+1的另一個+1) – Kimvais 2010-01-25 20:08:12

+0

真棒 - 感謝您的驚人迴應。我已經開始閱讀關於這個模塊/庫的內容,並且迄今爲止已經成功地使用它(仍然存在一些問題,但是我認爲我可以通過它「磨」到足以讓它工作,謝謝! j – 2010-01-25 22:21:54

+0

如果您將這個問題作爲一個新問題發佈並向我們展示更多腳本,您會得到最好的迴應,但除此之外,這聽起來像是您正在經歷預期的行爲,您通常不想編輯或移動如果你需要編輯/刪除文件作爲這個腳本的正常工作流程的一部分,那麼可以把它當作一個日誌文件來處理。如果沒有更多的信息,很難知道 – 2010-01-25 23:51:55

3

的問題是在這裏:

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

sys.stderr是在POSIX標準中定義的文件一樣的界面,稱爲standard error,而不是「錯誤文本」,你可以寫一個文件。所以你(可能)想做的事是:

sys.stderr = myFileErr 

這相當於python your_python_sctipt.py 2> PIDErrorLog.txt在UNIX shell中的蟒蛇。

0

像Kimvais說,你的問題是:

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

sys.stderr是一個文件句柄到stderr(stdout是寫的東西打印到)。

你應該這樣做:

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

艾莉森的回答也非常好,寫得很好。