0

I am trying to capture exceptions into one json object and print the output

import json, sys, traceback
import requests
output = {}
try:
    r = requests.get('http://wwww.google.com/nothere')
    r.raise_for_status()
    print(r)

except requests.exceptions.Timeout as et:
    output['status_code']='TIMEOUT'
    output['status']='failed'
    output['message']= json.dumps(et)
    #print("Timeout: ",et)
except requests.exceptions.HTTPError as eh:
    output['status_code']='HTTPError'
    output['status']='failed'
    output['message'] = json.dumps(eh)
    #print("HTTPError: ",eh)
except requests.exceptions.ConnectionError as errc:
    output['status_code']='ConnectTimeout'
    output['status']='failed'
    errorMessage = errc
    print("Message: ",errorMessage)
    output['message'] = errorMessage
    #print ("Error Connecting:",errc)
except requests.exceptions.RequestException as err:
    output['status_code']='GENErr'
    output['status']='failed'
    output['message'] = json.dumps(err)
print (json.dumps(output))

Output:

Message: HTTPConnectionPool(host='wwww.google.com', port=80): Max retries exceeded with url: /nothere (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000001B3A54384C0>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
Traceback (most recent call last):
  File "C:\ServiceNow\Teradatacsdev\agent\scripts\TDCloudNSPythonLibrary\helloworld.py", line 30, in <module>
    print (json.dumps(output))
  File "C:\Program Files\Python38\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Program Files\Python38\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Program Files\Python38\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Program Files\Python38\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type ConnectionError is not JSON serializable

Expected output:

{"status_code": "ConnectTimeout", "status": "failed", "message":"HTTPConnectionPool(host='wwww.google.com', port=80): Max retries exceeded with url: /nothere (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000001C5F15684C0>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))"}

I am trying to capture entire exception message in output['message'] json object. Any idea if I am doing anything wrong?

2 Answers 2

4

Because err is the exception object itself, which is not JSON serializable, so you cannot pass it in json.dumps(). You need to convert it to a str by doing json.dumps(str(err))

Sign up to request clarification or add additional context in comments.

Comments

0
import json, sys, traceback
import requests
output = {}
try:
    r = requests.get('http://wwww.google.com/nothere')
    r.raise_for_status()
    print(r)

except requests.exceptions.Timeout as et:
    output['status_code']='TIMEOUT'
    output['status']='failed'
    output['message']= json.dumps(str(et))
    #print("Timeout: ",et)
except requests.exceptions.HTTPError as eh:
    output['status_code']='HTTPError'
    output['status']='failed'
    output['message'] = json.dumps(str(eh))
    #print("HTTPError: ",eh)
except requests.exceptions.ConnectionError as errc:
    output['status_code']='ConnectTimeout'
    output['status']='failed'
    errorMessage = errc
    print("Message: ",errorMessage)
    output['message'] = str(errorMessage)
    #print ("Error Connecting:",errc)
except requests.exceptions.RequestException as err:
    output['status_code']='GENErr'
    output['status']='failed'
    output['message'] = json.dumps(str(err))
print (json.dumps(output))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.