2
2
import inspect
3
3
import logging
4
4
from string import Template
5
- from typing import Any , Optional , Union
5
+ from typing import Any , Callable , Optional , Union
6
6
from dataclasses import field , is_dataclass
7
7
8
8
from requests import Session
@@ -178,6 +178,7 @@ def get(
178
178
expected : Optional [int ] = 200 ,
179
179
authenticated : bool = False ,
180
180
display_errors : bool = True ,
181
+ error_handler : Optional [Callable [[int , dict ], Any ]] = None ,
181
182
) -> Union [dict , list [dict ]]:
182
183
"""Get Request.
183
184
@@ -208,6 +209,7 @@ def get(
208
209
params ["page" ] = page
209
210
210
211
response = self .session .get (url , params = params )
212
+ # Every response should be a JSON (including errors)
211
213
response_json = response .json ()
212
214
213
215
if expected and response .status_code != expected :
@@ -218,11 +220,16 @@ def get(
218
220
known_error = __OCTOKIT_ERRORS__ .get (response .status_code )
219
221
if known_error :
220
222
raise Exception (known_error )
221
- raise Exception ("REST Request failed :: non-expected server error" )
222
223
224
+ # Handle errors in the response
223
225
if isinstance (response_json , dict ) and response_json .get ("errors" ):
226
+ # Custom error handler callback
227
+ if error_handler :
228
+ return error_handler (response .status_code , response_json )
229
+
230
+ # Default error handling
224
231
logger .error (response_json .get ("message" ))
225
- raise Exception ("REST Request failed :: error from server" )
232
+ raise Exception ("REST Request failed :: non-expected server error " )
226
233
227
234
if isinstance (response_json , dict ):
228
235
return response_json
0 commit comments