2016-06-10 4 views
0

Я отлаживаю огромную устаревшую кодовую базу, фактически перенося ее с python2 на python3. К сожалению, есть некоторые исключения, которые, как представляется, обрабатываются и печатаются, но предыдущий разработчик не был достаточно мудрым, чтобы печатать трассировку стека, которая могла бы сказать мне, где именно было вызвано исключение.Можно ли переопределить печать() по всему миру?

В частности, я также портировать код с 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()', а не просто выполняет какой-то журнал? Вы можете просто вставить 'raise' во все блоки try/except. –

ответ

2

Вы можете переназначить sys.stdout и sys.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 
Смежные вопросы