1
1
import json
2
2
from typing import (
3
+ Any ,
4
+ Dict ,
5
+ List ,
3
6
Optional ,
4
7
Union ,
5
8
)
@@ -9,14 +12,16 @@ class Error(Exception):
9
12
def __init__ (
10
13
self ,
11
14
message : Optional [
12
- Union [str , list ]
15
+ Union [Dict [ str , Any ], list , str ]
13
16
] = None , # message should be a string but can sometimes incorrectly come back as a list
14
17
http_status : Optional [int ] = None ,
15
18
http_body : Optional [Union [str , bytes ]] = None ,
16
19
original_exception : Optional [Exception ] = None ,
17
20
):
18
21
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 )
20
25
self .http_status = http_status
21
26
self .http_body = http_body
22
27
self .original_exception = original_exception
@@ -32,3 +37,19 @@ def __init__(
32
37
self .param = self .json_body ["error" ].get ("param" , None )
33
38
except Exception :
34
39
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