@@ -201,7 +201,7 @@ def check_errors(keywords, *path):
201201 return None
202202
203203 def get_error_status_code (error ):
204- return error ["extensions" ]["exception" ][ "status" ]
204+ return error ["extensions" ]["exception" ]. get ( "status" )
205205
206206 if check_errors (["AUTHENTICATION_ERROR" ], "extensions" ,
207207 "code" ) is not None :
@@ -242,6 +242,18 @@ def get_error_status_code(error):
242242 # as they already know which resource type and ID was requested
243243 return None
244244
245+ resource_conflict_error = check_errors (["RESOURCE_CONFLICT" ],
246+ "extensions" , "code" )
247+ if resource_conflict_error is not None :
248+ raise labelbox .exceptions .ResourceConflict (
249+ resource_conflict_error ["message" ])
250+
251+ malformed_request_error = check_errors (["MALFORMED_REQUEST" ],
252+ "extensions" , "code" )
253+ if malformed_request_error is not None :
254+ raise labelbox .exceptions .MalformedQueryException (
255+ malformed_request_error ["message" ])
256+
245257 # A lot of different error situations are now labeled serverside
246258 # as INTERNAL_SERVER_ERROR, when they are actually client errors.
247259 # TODO: fix this in the server API
@@ -263,8 +275,14 @@ def get_error_status_code(error):
263275
264276 if len (errors ) > 0 :
265277 logger .warning ("Unparsed errors on query execution: %r" , errors )
278+ messages = list (
279+ map (
280+ lambda x : {
281+ "message" : x ["message" ],
282+ "code" : x ["extensions" ]["code" ]
283+ }, errors ))
266284 raise labelbox .exceptions .LabelboxError ("Unknown error: %s" %
267- str (errors ))
285+ str (messages ))
268286
269287 # if we do return a proper error code, and didn't catch this above
270288 # reraise
0 commit comments