'Do you have to use multipe try excepts for various KeyErrors closely coupled? Can they be combined without losing functionality in Try clause

Let's imagine I'm trying to print results from a request response. If I have multiple parameters I want to check, but may not necessarily be in every response I can contain them in a try clause that will check for a KeyError.

Problem is, I still would like to print the results. In my example below, if X-Next-Token is not a key in my results, I won't be able to print parameters pulled below.

Is there a design pattern for this that wouldn't require having to break out individual try and except clauses for every printing parameter example.

def print_response(response):
    
    print(response)
    results = response.json()['results']
    try:
        print(response.elapsed.total_seconds())
        print(response.headers["X-Next-Token"])
        print("First updatedAt:", results[0]['updatedAt'])
        print("Last updatedAt:", results[-1]['updatedAt'])
    except KeyError as e:
        print("There is no key:", e)


Solution 1:[1]

There is a few way to do this:

Separate try - expect

def print_response(response):
    
    print(response)
    results = response.json()['results']
    try:
        print(response.elapsed.total_seconds())
    KeyError as e:
        print("There is no key:", e)
    try:
        print(response.headers["X-Next-Token"])
    KeyError as e:
        print("There is no key:", e)
    try:
        print("First updatedAt:", results[0]['updatedAt'])
    KeyError as e:
        print("There is no key:", e)
    try:    
        print("Last updatedAt:", results[-1]['updatedAt'])
    KeyError as e:
        print("There is no key:", e)

Or as @Nick Bailey suggested, use get

def print_response(response):
    
    print(response)
    results = response.json()['results']
    print(response.elapsed.total_seconds())
    print(response.headers.get("X-Next-Token",""))
    print("First updatedAt:", results[0].get('updatedAt',"Not available"))
    print("Last updatedAt:", results[-1].get('updatedAt',"Not available"))
    

or you can check if value exist, this does the same as using get method in dict

def print_response(response):
    
    print(response)
    results = response.json()['results']
    print(response.elapsed.total_seconds())
    print("X-Next-Token" in response.headers and response.headers["X-Next-Token"] or "")
    print("First updatedAt:", "updatedAt" in results[0] and resutls[0]["updatedAt"] or "Not available")
    print("Last updatedAt:", "updatedAt" in results[-1] and results[-1]["updatedAt"] or "Not available")

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ex4