Форум сайта python.su
Реально ли написать такой декоратор, чтобы можно было завернуть в него функцию и потом в случае возникнования исключения получить pdb сесси внутри функции до/после строчки которая породила exception
Например, декоратор:
def debug(func): def inner(*args, **kwargs): try: for res in func(*args, **kwargs): yield res except Exception, ex: import pdb pdb.post_mortem() return inner
Офлайн
up? Или тебе нужно именно заавтоматизировать выход до фрейма декорированной функции? Тогда:
import pdb def up_to_decorated(self, pos): while self.curindex > 1: self.do_up(pos) pdb.Pdb.do_uu = up_to_decorated def debug(func): def inner(*args, **kwargs): try: func(*args, **kwargs) except Exception,e: pdb.post_mortem() return inner @debug def decorated(a, b): return deeper(a, b) def deeper(a, b): return more_deeper(a,b) def more_deeper(a,b): return a/b decorated(1,0)
sergeek@sergeek-desktop ~ $ python ~/test/pddb.py
> /home/sergeek/test/pddb.py(25)more_deeper()
-> return a/b
(Pdb) uu
> /home/sergeek/test/pddb.py(22)deeper()
-> return more_deeper(a,b)
> /home/sergeek/test/pddb.py(19)decorated()
-> return deeper(a, b)
(Pdb)
Отредактировано sergeek (Июль 3, 2013 14:26:35)
Офлайн
Я глянул в исходники werkzeug, там ведь тоже есть фича такая, middleware, которая позволяет в браузере на любом уровне стека смотреть переменные, но ничего там не понял и решил тут спросить. В исходники pdb не пришло в голову посмотреть.
Если честно, мне не нравится, твоё решение (патчинг стандартной либы). Если не найду ничего лучше, буду его юзать, спасибо. А нужно мне всё это вот для чего, я пишу очень много скраперов и часто возникает нужда без лишних телодвижений поймать внутри функции (обработчика сетевого ответа) исключение на уровне функции. Вот хочу в такой декоратор заворачивать функции.
Офлайн