11import json
22from typing import (
3+ Any ,
4+ Dict ,
5+ List ,
36 Optional ,
47 Union ,
58)
@@ -9,14 +12,16 @@ class Error(Exception):
912 def __init__ (
1013 self ,
1114 message : Optional [
12- Union [str , list ]
15+ Union [Dict [ str , Any ], list , str ]
1316 ] = None , # message should be a string but can sometimes incorrectly come back as a list
1417 http_status : Optional [int ] = None ,
1518 http_body : Optional [Union [str , bytes ]] = None ,
1619 original_exception : Optional [Exception ] = None ,
1720 ):
1821 super (Error , self ).__init__ (message )
19- self .message = ", " .join (message ) if type (message ) == list else message
22+ message_list : List [str ] = []
23+ Error .traverse_json_element (message , message_list )
24+ self .message = ", " .join (message_list )
2025 self .http_status = http_status
2126 self .http_body = http_body
2227 self .original_exception = original_exception
@@ -32,3 +37,19 @@ def __init__(
3237 self .param = self .json_body ["error" ].get ("param" , None )
3338 except Exception :
3439 self .param = None
40+
41+ @staticmethod
42+ def traverse_json_element (
43+ error_message : Optional [Union [Dict [str , Any ], list , str ]], messages_list : List [str ]
44+ ) -> None :
45+ """Recursively traverses a JSON object or array and extracts error messages
46+ as strings. Adds the extracted messages to the specified messages_list array.
47+ """
48+ if isinstance (error_message , dict ):
49+ for value in error_message .values ():
50+ Error .traverse_json_element (value , messages_list )
51+ elif isinstance (error_message , list ):
52+ for value in error_message :
53+ Error .traverse_json_element (value , messages_list )
54+ else :
55+ messages_list .append (str (error_message ))
0 commit comments