Блок 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'
Вернуться на верх