Reputation: 491
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?
Upvotes: 0
Views: 254
Reputation: 491
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))
Upvotes: 0
Reputation: 4318
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))
Upvotes: 4