2013-09-23 2 views
4

Если кто-то ловит исключение за пределами функции, которую он изначально выбрасывает, те теряют доступ к локальному стеку. В результате невозможно проверить значения переменных, которые могли бы вызвать исключение.Возможно ли автоматическое разбиение на отладчик при вызове исключения?

Есть ли способ автоматически начать перерыв в отладчике (import pdb; pdb.set_trace()), когда возникает исключение для проверки локального стека?

обновление

Спасибо за ваши два ответа, я + 1ed, но я нашел другое решение.

ответ

1

Я нашел то, что искал в ответ на What is the simplest way of using Python pdb to inspect the cause of an unhandled exception?

Заверните с этим:

<!-- language: lang-py --> 
def debug_on(*exceptions): 
    if not exceptions: 
     exceptions = (AssertionError,) 
    def decorator(f): 
     @functools.wraps(f) 
     def wrapper(*args, **kwargs): 
      try: 
       return f(*args, **kwargs) 
      except exceptions: 
       pdb.post_mortem(sys.exc_info()[2]) 
     return wrapper 
    return decorator 

Пример:

@debug_on(TypeError) 
def buggy_function() 
    .... 
    raise TypeError 
10

Вы не хотите прерывать каждое исключение; Идиоматический код Python сильно использует исключения (EAFP), поэтому вы постоянно нарушаете несвязанный код.

Вместо этого используйте pdb посмертное: import pdb; pdb.pm(). Это использует sys.last_traceback для проверки стека, включая местных жителей в точке бросания.

+0

Спасибо, отлично работает в интерпретатор, как в примере в [документации] (http://docs.python.org/2/library/pdb.html#debugger), но как это сделать в моем скрипте? – Framester

+0

@Framester Вы помещаете его в скрипт, где хотите его сломать. 'pdb.set_trace()', как у вас в вопросе, должен работать также, это то, что я обычно использую (не уверен, в чем разница) – Izkata

6

ipython поддерживает это (http://ipython.org). внутри IPython, сделать

%pdb on 

и с тех пор, он будет автоматически высадить вас в отладчик всякий раз, когда вы получите исключение.

Обратите внимание, что вы, вероятно, быстро устанете от этого в общем использовании ... каждый раз, когда вы что-то ошибаетесь и получаете синтаксическую ошибку, вам придется выйти из отладчика. но иногда это полезно.

Смежные вопросы