【问题标题】:Save KeyErrors and IndexErrors to a list/dict将 KeyErrors 和 IndexErrors 保存到列表/字典
【发布时间】:2015-07-23 23:12:39
【问题描述】:

我正在尝试从 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] 发生的错误的详细信息。如何保存/捕获这三个输出,将它们保存到对象中或使用这 3 条信息创建数据框?

【问题讨论】:

    标签: python list dictionary error-handling keyerror


    【解决方案1】:

    你是问如何追踪错误?

    如果是这样,回溯模块将提供如下帮助:

    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
    

    【讨论】:

      【解决方案2】:

      我不确定你在问什么,但如果你想保存打印的内容:

      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)
      

      【讨论】:

      • 感谢您的帮助。三件事。 [1] 我尝试了您建议的代码,但出现错误。原来“继续”只能在“for”或“while”循环中使用。 [2] 此外,函数完成后,我无法打印 key_err 或 idx_err,因为这两项在函数退出时“死亡”。 [3]。我相信 pd.Dataframe 行仅在我在异常下返回 {} 时才有效。我无法返回 key_err 或 idx_err。感谢您的帮助
      • key_err 和 idx_err 在函数之后不会死掉(除非你把它们放在函数定义中)。您还需要确保您的 dat 行位于函数体之外(请参阅我的编辑)。
      猜你喜欢
      • 1970-01-01
      • 2021-03-23
      • 2014-11-04
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多