2013-03-16 24 views
4

所以,我正在開發這個有索引器的類。我想拋出一個IndexError異常(或者用Python的術語「引發」)。嗯,這是非常容易的,在Python中引發錯誤,排除堆棧跟蹤中的最後一級

if errorCondition: 
    raise IndexError("index out of range") 

然而,當該代碼在控制檯運行的錯誤發生,堆棧跟蹤也包括引發錯誤的行:

Traceback (most recent call last): 
    File "code.py", line 261, in <module> 
    print myCards[99] 
    File "Full/Path/To/The/module.py", line 37, in __getitem__ 
    raise IndexError("item index out of range") 
IndexError: item index out of range 

我覺得這是一種奇怪的是,我想隱藏我的類從實現者的內部工作,而不是從外部模塊提供關於文件,行和代碼提取的信息。

有什麼方法可以管理嗎?提出錯誤的所有要點都是提供足夠的信息來描述函數調用出錯的原因,而不是外部代碼中出現錯誤的位置。

+2

退房http://stackoverflow.com/questions/4419785/dont-show-python-raise-line-in-the-exception-stack?rq=1它可能會幫助 – TerryA 2013-03-16 11:34:44

+1

一個堆棧跟蹤,坦率地告訴你什麼發生的地方非常有幫助,無論是代碼維護者讀取錯誤報告還是開發人員使用您的庫。無論如何,你無法隱藏源代碼,爲什麼要混淆你的堆棧痕跡呢? – 9000 2013-03-16 11:40:51

+0

嗯,這只是..不尋常的,與我有背景的其他編程語言相比。我想如果我在list [index]觸發IndexError時看不到源代碼,爲什麼我的代碼應該更開放。但是如果這對Python是文化的話,我可以吞下這個。 – Passiday 2013-03-16 12:28:29

回答

4

如果您將代碼分發爲.pyc字節碼文件(通常在首次導入模塊時自動生成),或者設法生成的.pyc文件沒有正確的.py源文件路徑(通過移動/刪除源文件),堆棧跟蹤將省略源代碼行。

您可以控制字節碼文件是如何使用compileall STDLIB模塊生成:http://docs.python.org/2/library/compileall.html

正如評論者所指出的,這是不尋常的 - 額外的信息可以節省寶貴的時間調試生產問題。