Try block is working but except block is not handling error in python

While Handling Python dictionary key error except block is not working but try block is working.

Below is my code


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)

Here in the second last line data_2=[catch_empty_key(invoice['not_a_key']) for invoice in data1['invoices']] except block of catch_empty_key function is not working and it is throwing an error.

On the Other hand if I replace second last line with something that is a key of invoice then try block is working and returning aaa as output. for example

data_2=[catch_empty_key(invoice['is_a_key']) for invoice in data1['invoices']] 

I want to understand why this error is coming and how can we solve it?

You are misunderstanding the concept of try-except. The code snippets need to be inside try block in order to catch any exception raised inside the snippets. In your given code, you can use it for requests.get() like this:

  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)

Hope this helps!!!!

The error gets produced when parsing the arguments you are passing, so it fails before evaluating the function; Modifying the function parameters so that the key gets checked within the function would work, for example:

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'
    

Alternatively you could check if the key exists by using in:

test = {'my':'dictionary'}
     
print('j' in test)

Outputs:

False

So you could simply have:

def catch_empty_key(dict_to_check, key):
    if key in dict_to_check:
        return 'aaaa'
    else:
        return 'bbbb'
Back to Top