【问题标题】:Continue a nested loop after exception异常后继续嵌套循环
【发布时间】:2020-02-19 19:51:20
【问题描述】:

我有一个嵌套循环来按我想要的方式获取某些 JSON 元素,但有时,我从中获取的 API 会变得混乱,并且会破坏一些字段 - 我不确定如何处理这个问题,因为看起来每次都不同,所以我想知道是否有办法继续嵌套的 for 循环,即使其中发生异常,或者至少回到第一个循环并再次继续。

我的代码是这样的:

 fields = ['email', 'displayname', 'login']
    sub_fields = ['level', 'name']

    all_data = []
    for d in data:
        login_value = d['login']
        if login_value.startswith('3b3'):
            continue
        student = fetched_student.student_data(login_value)
        student = json.loads(student)
        final_json = dict()
        try:
            for field in fields:
                #print ("Student field here: %s" % student[field])
                final_json[field] = student[field]
        except Exception as e:
            print (e) # this is where I get a random KeyValue Error
            #print ("Something happening here: %s " % final_json[field])
        finally:
            for sub_field in sub_fields:
                for element in student['users']:
                    if element.get(sub_field):
                        final_json[sub_field] = element.get(sub_field)
                for element in student['campus']:
                    if element.get(sub_field):
                        final_json[sub_field] = element.get(sub_field)
        all_data.append(final_json)
        print (all_data)

有没有办法在异常发生后返回第一个尝试块并继续,或者干脆忽略它并继续? 因为按照现在的情况,如果发生异常,它会破坏一切。

EDIT1:我尝试过这样继续:

try:
    for field in fields:
        #print ("Student field here: %s" % student[field])
        final_json[field] = student[field]
except Exception as e:
    print (e)
    continue
    for sub_field in sub_fields:
        for element in student['users']:

但无论如何它仍然失败。

【问题讨论】:

  • continue 是您要查找的语句。
  • 您能否编辑您的问题,以展示您在成功与失败时获得的数据示例?
  • @jordanm 我尝试使用 continue 而不是 finally 块,但它仍然以同样的方式崩溃。
  • @GreenCloakGuy 当然,等一下。
  • 将 try 块降低到 for 语句之后,以便启动循环并捕获循环内的异常。这样, continue 语句将影响该特定循环而不是外部循环

标签: python python-3.x


【解决方案1】:

将它用于 try 块:

for field in fields:
   try:
       #print ("Student field here: %s" % student[field])
       final_json[field] = student[field]
    except Exception as e:
        print (e)
        continue
for sub_field in sub_fields:
    for element in student['users']:

问题是由于 try 块的缩进级别, continue 影响了最外层的循环。将 try 块更改为循环内部将捕获该循环中的错误并继续该特定循环的迭代。

【讨论】:

  • 我会在我的VPN连接恢复后立即尝试,感谢您的回复!
  • 问题是代码可能会陷入无限循环。而不是捕获 any 异常,我只会捕获与该特定操作相关的异常。所以就这样做:except KeyError:(或任何你得到的异常)而不是:except Exception as e:。此外,如果 API 因您无法控制的原因而出现异常,并且您检测到数据已损坏(发生异常),那么我会重新启动,而不是继续循环忽略错误。您可能会得到不准确的数据。
  • 请详细说明,因为 continue 进入下一次迭代,它会如何陷入无限循环?这是遵循 OP 想要的格式,我不同意我们可以进入无限循环,因为它将转到字段中的最后一个值。您所说的所有其他内容都可以考虑,但不在此特定问题的范围内。
  • 如果它是一个while循环,我可以看到我们如何进入一个无限循环。但是由于for循环有一个上限,这是结束的条件,我看不到会发生什么本案
  • @EdekiOkoh 所以我试过了,但还是不行,这是我得到的例外for element in student['users']: KeyError: 'users'
【解决方案2】:

您可能可以在您的try 块中使用dict 的get 方法:

try:
    for field in fields:
        #print ("Student field here: %s" % student[field])
        final_json[field] = student.get(field, "") # 2nd arg is fallback object

根据需要,您可以传入一个新的 dict(又名 JSON 对象)、新的 list(又名 JSON 数组)或像上面一样的 str,以满足您的下游需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2018-03-20
    • 2015-08-19
    • 2021-03-25
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多