Блок try работает, но блок except не обрабатывает ошибку в python
Пока Обработка ошибки ключа словаря Python блок except не работает, но блок try работает.
Ниже приведен мой код
def catch_empty_key(a):
try:
return 'aaaa'
except :
return 'bbbb'
def zohoapicall(accesstoken):
accesstoken = ""
if accesstoken == "":
parameters = {
"refresh_token":"1000.06f10f49d6f00478887e3820634b928f.c045ff2a9dcb9c99057ec42645bf1e44",
"client_id":"1000.UKZQIWVQ2A2THKSZ2126Y7E7CAA8CW",
"client_secret":"91d25fbaeea0e81190a681708cd554a1030a9c4547",
"redirect_uri":"https://www.google.com",
"grant_type":"refresh_token",
}
response = requests.post("https://accounts.zoho.com/oauth/v2/token?", params=parameters)
if response.status_code == 200:
data = response.json()
accesstoken = data['access_token']
headers = {
'Content-Type':'application/json',
'Authorization':'Zoho-oauthtoken ' + str(accesstoken)
}
response = requests.get("https://books.zoho.com/api/v3/invoices", headers=headers)
if response.status_code == 200:
data1 = response.json()
data_2=[catch_empty_key(invoice['not_a_key']) for invoice in data1['invoices']]
return HttpResponse(data_2, accesstoken)
Здесь во второй последней строке data_2=[catch_empty_key(invoice['not_a_key']) for invoice in data1['invoices']]
except
блок функции catch_empty_key
не работает и выдает ошибку.
С другой стороны, если я заменю вторую последнюю строку на что-то, что является key
из invoice
, то блок try
работает и возвращает aaa
в качестве вывода. например
data_2=[catch_empty_key(invoice['is_a_key']) for invoice in data1['invoices']]
Я хочу понять, почему возникает эта ошибка и как ее решить?
Вы неправильно понимаете концепцию try-except. Фрагменты кода должны находиться внутри блока try, чтобы перехватить любое исключение, возникшее внутри фрагментов. В приведенном вами коде вы можете использовать его для requests.get()
следующим образом:
headers = {
'Content-Type':'application/json',
'Authorization':'Zoho-oauthtoken ' + str(accesstoken)
}
try:
response = requests.get("https://books.zoho.com/api/v3/invoices", headers=headers)
except Exception as e:
print(e)
if response.status_code == 200:
data1 = response.json()
data_2=[catch_empty_key(invoice['not_a_key']) for invoice in data1['invoices']]
return HttpResponse(data_2, accesstoken)
Надеюсь это поможет!!!!
Ошибка возникает при разборе передаваемых аргументов, поэтому ошибка возникает перед оценкой функции; изменение параметров функции таким образом, чтобы ключ проверялся внутри функции, например:
def catch_empty_key(dict_to_check, key):
try:
dict_to_check[key] # error will occur if key does not exist
return 'aaaa'
except:
return 'bbbb'
Альтернативно вы можете проверить, существует ли ключ, используя in
:
test = {'my':'dictionary'}
print('j' in test)
Выходы:
False
Так что вы могли бы просто иметь:
def catch_empty_key(dict_to_check, key):
if key in dict_to_check:
return 'aaaa'
else:
return 'bbbb'