#python #json #python-requests
#python #json #python-запросы
Вопрос:
Я пытаюсь записать исключения в один объект json и распечатать выходные данные
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))
Вывод:
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:ServiceNowTeradatacsdevagentscriptsTDCloudNSPythonLibraryhelloworld.py", line 30, in <module>
print (json.dumps(output))
File "C:Program FilesPython38libjson__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:Program FilesPython38libjsonencoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:Program FilesPython38libjsonencoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "C:Program FilesPython38libjsonencoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type ConnectionError is not JSON serializable
Ожидаемый результат:
{"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'))"}
Я пытаюсь захватить все сообщение об исключении в объекте output [‘message’] json. Есть идеи, если я делаю что-то не так?
Ответ №1:
Потому err
что это сам объект исключения, который не является сериализуемым в формате JSON, поэтому вы не можете передать его json.dumps()
. Вам нужно преобразовать его в str, выполнив json.dumps(str(err))
Ответ №2:
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))