我試圖找到導致我們的python腳本崩潰的原因。找不到異常的來源
主要結構是這樣的:
def main()
try:
dostuff
except Exception as ex:
import traceback
tb = traceback.format_exc()
import platform
node = platform.node()
sendMail([DEBUG_EMAIL], "Alarm exception on %s" % node, str(tb), [])
我得到這個堆棧跟蹤在我們的主要錯誤處理,不中我應該爲錯誤的電子郵件。
Traceback (most recent call last):
File "/usr/lib/python2.6/logging/__init__.py", line 799, in emit
stream.write(fs % msg.encode("UTF-8"))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 66: ordinal not in range(128)
從我看到所有的寫調用記錄的是在try塊裏面,但因爲它不是抓在我的電子郵件發送看來我錯過了什麼異常塊處理。我已經檢查過,sendMail函數完全不使用日誌記錄模塊。所以這個異常不應該出現在我的except塊中。
我嘗試添加
sys.tracebacklimit = 10
在文件的頂部看到異常起源,但沒有造成任何影響。現在我對如何找到問題的起源有什麼想法。
該腳本每小時運行一次,每週大約一次崩潰,這使得我認爲它與輸入數據有關,但只能由dostuff()處理。
UPDATE:
我已經想通了,爲什麼我只得到堆棧跟蹤的一行。在emit()裏面我發現了這個。
try:
... doing stuff, something goes boom with encoding...
except UnicodeError:
stream.write(fs % msg.encode("UTF-8")) Here it goes Boom again
self.flush()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record) Which means it ends up here
而且功能的HandleError的相關部分看起來是這樣的:
ei = sys.exc_info()
try:
traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr)
哪隻打印堆棧跟蹤的最後一部分。
我不確定你的意思。 – dutt
異常似乎發生在日誌包的'__init __。py'腳本中,所以在腳本加載時也會發生異常,並且無法在輸入try塊之前導入'logging', – val
@ValentinCLEMENT添加了有關使用情況的信息和崩潰頻率。 – dutt