为了账号安全,请及时绑定邮箱和手机立即绑定

Python/API:处理服务器未返回的错误

Python/API:处理服务器未返回的错误

互换的青春 2021-09-14 20:23:52
我正在努力处理 Outbrain API 服务器未返回的错误。我所做的是使用国家/地区名称向服务器发送 GET 请求,它返回一个包含所需 ID 值的 JSON 响应,但是当我输入国家/地区名称时输入错误,JSON 响应为空,而不是带有错误的 JSON消息(如果我没记错的话)。所以我试图自己处理错误,但它不起作用。这是我的代码(其中 csv[row][2] = United Kinjdom):r = requests.get('https://api.outbrain.com/amplify/v0.1/locations/search?term=' + csv[row][2] + '&limit=7', headers=headers)try:    print(r.json())    data = r.json()    error()except:    print(r.text)    data = r.text    error()for results in data:    if results['geoType']:        if results['geoType'] == 'Country' and results['name'] == csv[row][2]:            print(results['id'])            countryId = results['id']    else:        logText = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + ": Country name error"        c.execute("INSERT INTO log VALUES (?)", [logText])        conn.commit()        os._exit(1)第一个打印返回“[]”并且代码似乎没有到达“else”语句,因此我可以将错误添加到日志数据库中。这是正确拼写国家/地区时的服务器响应:[{'id': 'c20768bb56a25c22299c38801e935c3a', 'geoType': 'Country', 'name': 'United Kingdom', 'canonicalName': 'United Kingdom', 'code': 'GB'},{'id': '7477c333ed4e1895b040efe45c30c816', 'geoType': 'Region', 'name': 'Darlington', 'canonicalName': 'Darlington, United Kingdom', 'code': 'D1', 'parent': {'id': 'c20768bb56a25c22299c38801e935c3a', 'geoType': 'Country', 'name': 'United Kingdom', 'canonicalName': 'United Kingdom', 'code': 'GB'}},{'id': 'd9a9732283ec131e7fa422843449baa4', 'geoType': 'Region', 'name': 'Bath and North East Somerset', 'canonicalName': 'Bath and North East Somerset, United Kingdom', 'code': 'A4', 'parent': {'id': 'c20768bb56a25c22299c38801e935c3a', 'geoType': 'Country', 'name': 'United Kingdom', 'canonicalName': 'United Kingdom', 'code': 'GB'}}, {'id': '92b5f5ef7a5a25e60263e365982be9ad', 'geoType': 'Region', 'name': 'Northumberland', 'canonicalName': 'Northumberland, United Kingdom', 'code': 'J6', 'parent': {'id': 'c20768bb56a25c22299c38801e935c3a', 'geoType': 'Country', 'name': 'United Kingdom', 'canonicalName': 'United Kingdom', 'code': 'GB'}},
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

从你的问题来看,也许你的代码只执行try和except部分。由于您首先print给出了 output [],那么服务器可能不会返回任何内容,甚至不会返回警告消息。由于您的数据是空列表,因此for不会执行循环。我担心的是,Exception除了这里,你想要做什么。如果您需要处理服务器返回的结果以防您输入错误,这意味着您收到一个空列表,那么我建议:


data = r.json()    

if not data: raise Exception

然后将此代码块放入 except 处理部分,而不是将它们放入 else 部分(如果这是您希望在发生时Exception发生的情况)。


logText = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + ": Country name error"

c.execute("INSERT INTO log VALUES (?)", [logText])

conn.commit()

os._exit(1)

此外,您正在使用if results['geoType'],if True仅当 'geoType' 键的值不等于 时None,该else部分才应仅在该值为 时才执行None。这有点危险,因为如果键不在结果中,那么它会立即引发Exception. 我可能会建议您在这里更具体一点,因为这可能会让您头疼。


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 268 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信