@@ -22,7 +22,13 @@ class ImageUploadError(RoboflowError):
22
22
def __init__ (self , message , status_code = None ):
23
23
self .message = message
24
24
self .status_code = status_code
25
- self .retries = 0
25
+ super ().__init__ (self .message )
26
+
27
+
28
+ class AnnotationSaveError (RoboflowError ):
29
+ def __init__ (self , message , status_code = None ):
30
+ self .message = message
31
+ self .status_code = status_code
26
32
super ().__init__ (self .message )
27
33
28
34
@@ -101,7 +107,7 @@ def upload_image(
101
107
if responsejson :
102
108
raise ImageUploadError (responsejson , status_code = response .status_code )
103
109
else :
104
- raise ImageUploadError (response )
110
+ raise ImageUploadError (response , status_code = response . status_code )
105
111
106
112
if not responsejson : # fail fast
107
113
raise ImageUploadError (response , status_code = response .status_code )
@@ -141,24 +147,27 @@ def save_annotation(
141
147
headers = {"Content-Type" : "application/json" },
142
148
timeout = (60 , 60 ),
143
149
)
150
+
151
+ # Handle response
144
152
responsejson = None
145
153
try :
146
154
responsejson = response .json ()
147
155
except Exception :
148
156
pass
157
+
149
158
if not responsejson :
150
- raise _save_annotation_error (image_id , response )
151
- if response .status_code not in (200 , 409 ):
152
- raise _save_annotation_error (image_id , response )
159
+ raise AnnotationSaveError (response , status_code = response .status_code )
160
+
153
161
if response .status_code == 409 :
154
162
if "already annotated" in responsejson .get ("error" , {}).get ("message" ):
155
163
return {"warn" : "already annotated" }
156
- else :
157
- raise _save_annotation_error (image_id , response )
164
+
158
165
if responsejson .get ("error" ):
159
- raise _save_annotation_error (image_id , response )
166
+ raise AnnotationSaveError (responsejson ['error' ], status_code = response .status_code )
167
+
160
168
if not responsejson .get ("success" ):
161
- raise _save_annotation_error (image_id , response )
169
+ raise AnnotationSaveError (responsejson , status_code = response .status_code )
170
+
162
171
return responsejson
163
172
164
173
@@ -202,19 +211,3 @@ def _local_upload_url(api_key, project_url, batch_name, tag_names, sequence_numb
202
211
query_params .update (sequence_number = sequence_number , sequence_size = sequence_size )
203
212
204
213
return _upload_url (api_key , project_url , ** query_params )
205
-
206
-
207
- def _save_annotation_error (image_id , response ):
208
- errmsg = f"save annotation for { image_id } / "
209
- responsejson = None
210
- try :
211
- responsejson = response .json ()
212
- except Exception :
213
- pass
214
- if not responsejson :
215
- errmsg += f"bad response: { response .status_code } : { response } "
216
- elif responsejson .get ("error" ):
217
- errmsg += f"bad response: { response .status_code } : { responsejson ['error' ]} "
218
- else :
219
- errmsg += f"bad response: { response .status_code } : { responsejson } "
220
- return UploadError (errmsg )
0 commit comments