1212
1313import http .client
1414
15- # Start Toopher-specific codes at 600 to avoid conflict/confusion with HTTP status codes
15+
16+ # Start DDA-specific codes at 600 to avoid conflict/confusion with HTTP status codes
1617import sys
1718
1819logger = logging .getLogger (__name__ )
@@ -75,10 +76,8 @@ def error_code(self):
7576 return self .__dict__ ["error_code" ]
7677 except KeyError :
7778 raise AttributeError (
78- "'{}' object has no attribute '{}'" .format (
79- ApiError .__name__ , "error_code"
80- )
81- )
79+ f"'{ ApiError .__name__ } ' object has no attribute 'error_code'"
80+ ) from None # suppress reporting the KeyError
8281
8382 @error_code .setter
8483 def error_code (self , value ):
@@ -113,7 +112,7 @@ def __init__(self, additional_info=None):
113112 http .client .responses .get (http .client .NOT_FOUND ),
114113 )
115114 if additional_info :
116- error_message += " : " + additional_info
115+ error_message += f": { additional_info } "
117116 super ().__init__ (
118117 error_code , error_message , http_status_code = http .client .NOT_FOUND
119118 )
@@ -123,7 +122,7 @@ class ClientErrorForbidden(ClientError):
123122 def __init__ (self , additional_info = None , ** kwargs ):
124123 error_code , error_message = FORBIDDEN
125124 if additional_info :
126- error_message += ": %s" % additional_info
125+ error_message += f ": { additional_info } "
127126 super ().__init__ (
128127 error_code , error_message , http_status_code = http .client .FORBIDDEN , ** kwargs
129128 )
@@ -147,21 +146,25 @@ class ClientErrorExternalServiceFailure(ClientError):
147146 def __init__ (self , additional_info = None ):
148147 error_code , error_message = EXTERNAL_REQUEST_FAILURE
149148 if additional_info :
150- error_message += ": {0}" . format ( additional_info )
149+ error_message += f ": { additional_info } "
151150 super ().__init__ (error_code , error_message )
152151
153152
154153class ClientErrorRequestThrottled (ClientError ):
155154 def __init__ (self ):
156155 error_code , error_message = REQUEST_THROTTLED
157- super ().__init__ (error_code , error_message , http_status_code = 429 )
156+ super ().__init__ (
157+ error_code ,
158+ error_message ,
159+ http_status_code = http .HTTPStatus .TOO_MANY_REQUESTS ,
160+ )
158161
159162
160163class ClientErrorTimedOut (ClientError ):
161164 def __init__ (self , additional_info = None ):
162165 error_code , error_message = TIMED_OUT
163166 if additional_info :
164- error_message += ": %s" % additional_info
167+ error_message += f ": { additional_info } "
165168 super ().__init__ (
166169 error_code , error_message , http_status_code = http .client .REQUEST_TIMEOUT
167170 )
@@ -170,7 +173,7 @@ def __init__(self, additional_info=None):
170173class ClientErrorResponseWrapper (ClientError ):
171174 def __init__ (self , response ):
172175 error_code = response .status_code
173- error_message = response .content
176+ error_message = response .content . decode ()
174177 status_code = response .status_code
175178 super ().__init__ (error_code , error_message , http_status_code = status_code )
176179
@@ -179,43 +182,45 @@ class ClientErrorExtraFields(ClientError):
179182 def __init__ (self , extra_fields = None ):
180183 error_code , error_message = EXTRA_FIELDS
181184 if extra_fields :
182- error_message += ": %s" % ", " .join (extra_fields )
185+ error_message += f ": { ', ' .join (extra_fields )} "
183186 super ().__init__ (error_code , error_message )
184187
185188
186189class ClientErrorReadOnlyFields (ClientError ):
187190 def __init__ (self , read_only_fields = None ):
188191 error_code , error_message = READ_ONLY_FIELDS
189192 if read_only_fields :
190- error_message += ": %s" % ", " .join (read_only_fields )
193+ error_message += f ": { ', ' .join (read_only_fields )} "
191194 super ().__init__ (error_code , error_message )
192195
193196
194197class ClientErrorMissingFields (ClientError ):
195198 def __init__ (self , missing_fields = None , extra_message = None ):
196199 error_code , error_message = MISSING_FIELDS
197200 if missing_fields :
198- error_message += ": %s" % ", " .join (missing_fields )
201+ error_message += f ": { ', ' .join (missing_fields )} "
199202 if extra_message :
200- error_message += ": {0}" . format ( extra_message )
203+ error_message += f ": { extra_message } "
201204 super ().__init__ (error_code , error_message )
202205
203206
204207class ClientErrorInvalidFieldValues (ClientError ):
205208 def __init__ (self , invalid_fields = None , extra_message = None ):
206209 error_code , error_message = INVALID_FIELD_VALUES
207210 if invalid_fields :
208- error_message += ": %s" % ", " .join (invalid_fields )
211+ error_message += f ": { ', ' .join (invalid_fields )} "
209212 if extra_message :
210- error_message += ": {0}" . format ( extra_message )
213+ error_message += f ": { extra_message } "
211214 super ().__init__ (error_code , error_message )
212215
213216
214217class ServerError (ApiError ):
215- def __init__ (self ):
218+ def __init__ (self , additional_info = None ):
216219 error_code , error_message = LOGGED_SERVER_ERROR
217- error_message = error_message .format (uuid .uuid4 ())
218- logger .exception (error_message )
220+ logged_error = error_message = error_message .format (uuid .uuid4 ())
221+ if additional_info :
222+ logged_error += f": { additional_info } "
223+ logger .exception (logged_error )
219224
220225 self ._cause = None
221226
0 commit comments