2015-04-20 2 views
2

Я хочу получить более подробный журнал ошибок.Capture exception raise frame в Python

В частности, я хотел бы получить доступ к f_locals фрейма исключения изнутри предложения except.

def dumb_raiser(string: str): 
    if not isinstance(string, str): 
     raise ValueError("Yup") 

try: 
    dumb_raiser(1) 
except ValueError as ex: 
    # grab f_locals from frame and log here 
    pass 

Как получить доступ к необходимой структуре для этого?

ответ

0

Один подход заключается просто лавировать на функцию-х locals() к исключению, когда вы поднимаете его:

def dumb_raiser(string: str): 
    if not isinstance(string, str): 
     raise ValueError("Yup", locals()) 

try: 
    dumb_raiser(1) 
except ValueError as ex: 
    print(ex.args[1]) 

Печатается: {'string': 1}, как можно было ожидать.

+0

Проблема с улавливанием исключения из библиотеки, которую я не писал, которая является большей частью моей обработки исключений. – thismachinechills

+0

@thismachinechills Вы уверены, что кадр стека все еще существует, когда функция библиотеки вызывает исключение и возвращается к вызывающему коду? Я не верю, что это так. Возможно, вам придется что-то сделать с помощью 'sys.settrace', чтобы сохранить его. – jme

0

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

def derp(f): 
    def wrapped(*args, **kwargs): 
     try: 
      f(*args, **kwargs) 
     except Exception as ex: 
      raise ValueError("Failed args %s" % args) 
    return wrapped 


def dumb_raiser(string): 
    if not isinstance(string, str): 
     raise ValueError("Yup") 

try: 
    dumb_raiser = derp(dumb_raiser) 
    dumb_raiser(1) 
except ValueError as ex: 
    print ex.message 

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

0

Вы можете вытащить из Sentry's Python client, который захватывает местные штабы с f_locals.

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