2011-10-01 52 views
0

我有一個解碼異常並將信息推送到文件的函數。以下是我做的基本上是:python的cgitb和inspect.py奇怪的例外

exc_info = sys.exc_info 
txt = cgitb.text(exc_info) 

利用這一點,我得到了以下異常跟蹤:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "C:\Python27\lib\site-packages\job_queue\utils\start_workers.py", line 40, in start_worker 
    worker_loop(r_jq, worktype, worker_id) 
File "C:\Python27\lib\site-packages\job_queue\server\jq_worker.py", line 55, in worker_loop  
    _job_machine(*job) 
File "C:\Python27\lib\site-packages\job_queue\server\jq_worker.py", line 34, in _job_machine 
    do_verbose_exception() 
File "C:\Python27\lib\site-packages\job_queue\server\errors.py", line 23, in do_verbose_exception 
    txt = cgitb.text(exc_info) 
File "C:\Python27\lib\cgitb.py", line 214, in text 
    formatvalue=lambda value: '=' + pydoc.text.repr(value)) 
File "C:\Python27\lib\inspect.py", line 885, in formatargvalues 
    specs.append(strseq(args[i], convert, join)) 
File "C:\Python27\lib\inspect.py", line 840, in strseq 
    return convert(object) 
File "C:\Python27\lib\inspect.py", line 882, in convert 
    return formatarg(name) + formatvalue(locals[name]) 
KeyError: 'connection' 

我多次跑代碼這種異常後,卻無法重現。但是,我沒有在文件cgitb.py或inspect.py中找到任何帶有'連接'鍵的字典。

有人會知道這是python的cgitb或inspect文件的問題嗎?任何有用的輸入?

回答

0

我不確定具體爲什麼會發生這種異常,但你有沒有閱讀cgitb模塊的文檔?看來,因爲Python 2.2已經支持寫入例外文件: http://docs.python.org/library/cgitb.html

大概是這樣的: cgitb.enable(0「/我的/日誌/目錄」)#或1,如果你想看到它在瀏覽器中

至於你的實際追溯,你確定'連接'不是你在自己的代碼中使用的名稱? 'inspect'模塊很可能試圖檢查自己的代碼來構建cgi回溯信息並在某處獲得一個錯誤密鑰?

+0

我交叉檢查我的代碼庫,並且在我的代碼庫中沒有 '連接' 對象。實際上,我在碰撞發生後使用相同的上下文來運行它,並且它是成功的。如果你觀察崩潰日誌,第882行顯示'locals [name]',這個崩潰是由於name - >連接。仍然無能爲力,這從何而來。 – Ethan

+0

我已經通過cgitb代碼。即使使用cgitb.enable和日誌目錄名也不能解決這個問題 - 在嘗試解碼由sys.exc_info返回的etraceback時會發生這種情況,這也將在那裏使用。 – Ethan

+0

好的,我想我找到了問題。我使用MySQLdb,引發的異常是使用'defaulthandler'(file:connections.py),在引發錯誤後'connection'被刪除。不知道爲什麼這樣做。不過,我可以繞着'txt = cgitb.text(exc_info)'使用'traceback.format_exception'的異常處理程序來解決這個問題。感謝您的幫助。 – Ethan

1

您將錯誤的類型傳遞給文本函數 下面是正確的方法。

cgitb.text((sys.last_type,sys.last_value,sys.last_traceback))