Python/API:处理服务器无法处理的错误';不归

Python/API:处理服务器无法处理的错误';不归,python,api,Python,Api,我正在努力处理Outbrain API服务器无法返回的错误。我要做的是向服务器发送一个带有国家名称的GET请求,它返回一个包含所需ID值的JSON响应,但是当我输入带有输入错误的国家名称时,JSON响应是空的,而不是带有错误消息的JSON(如果我没有弄错的话)。所以我试图自己处理这个错误,但它不起作用。这是我的代码(其中csv[row][2]=United Kinjdom): 第一次打印返回“[]”,代码似乎没有到达“else”语句,因此我可以将错误添加到日志数据库中 当国家/地区拼写正确时,此

我正在努力处理Outbrain API服务器无法返回的错误。我要做的是向服务器发送一个带有国家名称的GET请求,它返回一个包含所需ID值的JSON响应,但是当我输入带有输入错误的国家名称时,JSON响应是空的,而不是带有错误消息的JSON(如果我没有弄错的话)。所以我试图自己处理这个错误,但它不起作用。这是我的代码(其中csv[row][2]=United Kinjdom):

第一次打印返回“[]”,代码似乎没有到达“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'}},
{'id': '3a83dddcd55e92aaab4b142c7858892d', 'geoType': 'Region', 'name': 'Vale of Glamorgan', 'canonicalName': 'Vale of Glamorgan, United Kingdom', 'code': 'Z3', 'parent': {'id': 'c20768bb56a25c22299c38801e935c3a', 'geoType': 'Country', 'name': 'United Kingdom', 'canonicalName': 'United Kingdom', 'code': 'GB'}},
{'id': '915c6d5814a9826e34e1a5c0a423797a', 'geoType': 'Region', 'name': 'Walsall', 'canonicalName': 'Walsall, United Kingdom', 'code': 'O8', 'parent':                     {'id': 'c20768bb56a25c22299c38801e935c3a', 'geoType': 'Country', 'name': 'United Kingdom', 'canonicalName': 'United Kingdom', 'code': 'GB'}},
{'id': 'e96bcc2de342e74e491d3b6ab95cfedc', 'geoType': 'Region', 'name': 'Tameside', 'canonicalName': 'Tameside, United Kingdom', 'code': 'O1', 'parent': {'id': 'c20768bb56a25c22299c38801e935c3a', 'geoType': 'Country', 'name': 'United Kingdom', 'canonicalName': 'United Kingdom', 'code': 'GB'}}]

您应该先检查结果列表(
数据
)是否为空,在这种情况下,您可以对其进行迭代,否则无法进行,这就是为什么从不在else子句中输入

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()

if data:    
    for result in data:
        if result.get('geoType') == 'Country' and result['name'] == csv[row][2]:
            print(result['id'])
            countryId = result['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子句中输入

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()

if data:    
    for result in data:
        if result.get('geoType') == 'Country' and result['name'] == csv[row][2]:
            print(result['id'])
            countryId = result['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)

从您的问题中,您的代码可能只执行
try
部分之外的
。由于您的第一次
打印
给出了输出
[]
,因此服务器可能不会返回任何内容,甚至不会返回警告消息。由于您的数据是空列表,因此不会执行
for
循环。我关心的是,您试图在这里排除的
异常是什么。如果您需要处理服务器在您输入错误时返回的结果,这意味着您将收到一个空列表,那么我建议:

data = r.json()    
if not data: raise Exception
然后将此代码块放入except处理部分,而不是放入else部分(如果这是发生
异常时希望发生的情况)


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

从您的问题来看,您的代码可能只执行
部分,而
部分除外。由于您的第一次
打印
给出了输出
[]
,因此服务器可能不会返回任何内容,甚至不会返回警告消息。由于您的数据是空列表,因此不会执行
for
循环。我关心的是,您试图在这里排除的
异常是什么。如果您需要处理服务器在您输入错误时返回的结果,这意味着您将收到一个空列表,那么我建议:

data = r.json()    
if not data: raise Exception
然后将此代码块放入except处理部分,而不是放入else部分(如果这是发生
异常时希望发生的情况)


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

在发送请求之前验证请求不是更明智吗…?脚本不仅要考虑每个国家,但是每个城市和DMA,这对Code来说都是一个麻烦我想你应该移动你的else语句,或者在迭代中添加一个次要的else,这样如果名称不匹配,它就会返回一个错误,但是你应该像上面所说的那样重构它。在发送请求之前验证请求不是更明智吗…?脚本不仅要考虑每个国家,但是每个城市和DMA,这对编码来说都是一个麻烦。我想你想在迭代中移动你的else语句或添加一个辅助else,因此如果名称不匹配,它会返回一个错误,但是你应该像上面所说的那样重构它。我的错,我验证了错误的东西。谢谢你的解释,这很有帮助。我唯一不明白的是,为什么服务器返回一个空列表而不是一条警告消息。我想知道这是否不是我在请求中犯的错误。我认为这是因为API没有进行检查以正确处理请求。在这种情况下,可能服务器不返回任何内容,或者服务器端不接受请求,然后他们决定忽略它。这是我的第一个猜测。谢谢你验证。我的错,我验证错了。谢谢你的解释,这很有帮助。我唯一不明白的是,为什么服务器返回一个空列表而不是一条警告消息。我想知道这是否不是我在请求中犯的错误。我认为这是因为API没有进行检查以正确处理请求。在这种情况下,可能服务器不返回任何内容,或者服务器端不接受请求,然后他们决定忽略它。这是我的第一个猜测。谢谢你的验证。