2016-06-10 145 views
0

我正在調試一個龐大的遺留代碼庫,實際上是將它從python2移植到python3。 不幸的是,有些例外似乎是被處理和打印出來的,但是之前的開發人員不夠明智,無法打印堆棧跟蹤,這可以告訴我在哪裏觸發了異常。是否可以在全局覆蓋print()?

具體來說,我也是從GTK移植代碼+ 2 GTK + 3,我得到許多這些輸出線:

TypeError: expose() missing 1 required positional argument: 'event' 

在這一點上,它似乎是唯一的選擇就是在全球範圍內劫持print()函數以至少顯示哪個模塊以及它被調用的是哪一行。

你知道python3中可能嗎? (我是python2的老手,但是python3的新手)

關於如何解決這個問題的其他建議?

+1

http://stackoverflow.com/a/10106489/2141635 –

+0

@PadraicCunningham:它不起作用。看起來,該代碼是爲python2而設計的,而我正在使用python3,正如我在我的文章中所寫的那樣。 – fstab

+0

你確定代碼調用'print()'而不僅僅是做某種類型的日誌?你可以在所有的「try/except」塊中加一個'raise'。 –

回答

2

您可以將sys.stdoutsys.stderr重新映射到重寫的類文件對象,並且每當寫入內容時,檢查當前是否在異常幀內,如果是,則重新引發異常。

import io 
import sys 


class Stream(io.StringIO): 

    def write(*args, **kwargs): 
     if sys.exc_info()[0] is not None: 
      raise 
     super().write(*args, **kwargs) 

stream = Stream() 
sys.stdout = stream 
sys.stderr = stream