Сохранить KeyErrors и IndexErrors в список/словарь

Я пытаюсь извлечь данные из API и ожидаю получить KeyError и IndexError, поэтому я использую функцию try/except, чтобы их перехватить. Сначала я создаю список элементов, которые я просматриваю, чтобы извлечь информацию из ответов API. Затем я создаю фрейм данных, в котором хранится информация об элементах, в которых не было ошибок.

l= ["a","b","c","d"] 
def extract_info_from_one_response(response, idx):
    try:
        response = response.json()
        d = {
            ### some codes ##
            }
    ## ERROR MANAGEMENT
    except KeyError,e:
        print idx, l[idx], str(e)
        return {}
    except IndexError,e:
        print idx, l[idx], str(e)
        return {}
    dat = pd.DataFrame([extract_info_from_one_response(response, idx) for idx, response in enumerate(responses)], index=l)

Когда возникают ошибки, Python выводит [1] индекс проблемного элемента, [2] имя элемента и [3] сведения о возникшей ошибке. Как мне сохранить/захватить эти три вывода, сохранить их в объекты или создать фрейм данных с этими тремя фрагментами информации?


person Quan Mai    schedule 23.07.2015    source источник


Ответы (2)


Вы спрашиваете, как отследить ошибку?

Если это так, модуль трассировки поможет следующим образом:

In [1]: import traceback

In [2]: try:
   ...:     a = []
   ...:     a[2] = 1
   ...: except Exception:
   ...:     y = traceback.format_exc()
   ...:     

In [4]: print y
Traceback (most recent call last):
  File "<ipython-input-2-ac34fe2721d3>", line 3, in <module>
    a[2] = 1
IndexError: list assignment index out of range
person Zagfai    schedule 29.07.2015

Я не уверен, что вы спрашиваете, но если вы хотите сохранить то, что напечатано:

key_err = []
idx_err = []

def extract_info_from_one_response(response, idx):
   try:
     # your code here
   except KeyError, e:
       key_err.append((idx, l[idx], '{}'.format(e),))
       return {}
   except IndexError, e:
       idx_err.append((idx, l[idx], '{}'.format(e),))
       return {}
   # your normal code here
   # you need to return something here
dat = pd.DataFrame([extract_info_from_one_response(response, idx) for idx, response in enumerate(responses)], index=l)
print(key_err)
print(idx_err)
person Burhan Khalid    schedule 29.07.2015
comment
Спасибо за вашу помощь. Три вещи. [1] Я попробовал предложенный вами код и получил ошибку. Оказывается, «продолжить» можно использовать только в циклах «для» или «пока». [2] Кроме того, после завершения функции я не могу напечатать key_err или idx_err, так как эти два элемента умерли при выходе из функции. [3]. Я считаю, что строка pd.Dataframe работает только в том случае, если я возвращаю {} в исключениях. Я не могу вернуть key_err или idx_err. спасибо за помощь - person Quan Mai; 31.07.2015
comment
key_err и idx_err не умирают после функции (если вы не поместите их в определение функции). Вам также необходимо убедиться, что ваша строка данных находится за пределами тела функции (см. мое редактирование). - person Burhan Khalid; 31.07.2015