Skip to content

Commit 74ff188

Browse files
committed
refactor: unify server error handling
1 parent 99170c6 commit 74ff188

5 files changed

Lines changed: 24 additions & 124 deletions

File tree

frost_sta_client/dao/base.py

Lines changed: 5 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -104,22 +104,7 @@ def create(self, entity):
104104
try:
105105
response = self.service.execute('post', url, json=json_dict)
106106
except requests.exceptions.HTTPError as e:
107-
# Handle non-JSON error responses gracefully
108-
try:
109-
err = e.response.json()
110-
if isinstance(err, dict):
111-
error_message = err.get('message', err.get('error', str(err)))
112-
else:
113-
error_message = str(err)
114-
except Exception:
115-
try:
116-
error_message = getattr(e.response, 'text', str(e))
117-
except Exception:
118-
error_message = str(e)
119-
logging.error("Creating {} failed with status-code {}, {}".format(type(entity).__name__,
120-
getattr(e.response, 'status_code', 'unknown'),
121-
error_message))
122-
raise e
107+
frost_sta_client.utils.handle_server_error(e, 'Creating {}'.format(type(entity).__name__))
123108
entity.id = frost_sta_client.utils.extract_value(response.headers['location'])
124109
entity.service = self.service
125110
logging.debug('Received response: ' + str(response.status_code))
@@ -148,22 +133,7 @@ def patch(self, entity, patches):
148133
try:
149134
response = self.service.execute('patch', url, json=patches, headers=headers)
150135
except requests.exceptions.HTTPError as e:
151-
# Handle non-JSON error responses gracefully
152-
try:
153-
err = e.response.json()
154-
if isinstance(err, dict):
155-
error_message = err.get('message', err.get('error', str(err)))
156-
else:
157-
error_message = str(err)
158-
except Exception:
159-
try:
160-
error_message = getattr(e.response, 'text', str(e))
161-
except Exception:
162-
error_message = str(e)
163-
logging.error("Patching {} failed with status-code {}, {}".format(type(entity).__name__,
164-
getattr(e.response, 'status_code', 'unknown'),
165-
error_message))
166-
raise e
136+
frost_sta_client.utils.handle_server_error(e, 'Patching {}'.format(type(entity).__name__))
167137
logging.debug(f'Received response: {str(response.status_code)}')
168138

169139
def update(self, entity):
@@ -176,22 +146,7 @@ def update(self, entity):
176146
try:
177147
response = self.service.execute('put', url, json=json_dict)
178148
except requests.exceptions.HTTPError as e:
179-
# Handle non-JSON error responses gracefully
180-
try:
181-
err = e.response.json()
182-
if isinstance(err, dict):
183-
error_message = err.get('message', err.get('error', str(err)))
184-
else:
185-
error_message = str(err)
186-
except Exception:
187-
try:
188-
error_message = getattr(e.response, 'text', str(e))
189-
except Exception:
190-
error_message = str(e)
191-
logging.error("Updating {} failed with status-code {}, {}".format(type(entity).__name__,
192-
getattr(e.response, 'status_code', 'unknown'),
193-
error_message))
194-
raise e
149+
frost_sta_client.utils.handle_server_error(e, 'Updating {}'.format(type(entity).__name__))
195150
logging.debug('Received response: {}'.format(str(response.status_code)))
196151

197152
def find(self, id):
@@ -201,22 +156,7 @@ def find(self, id):
201156
try:
202157
response = self.service.execute('get', url)
203158
except requests.exceptions.HTTPError as e:
204-
# Handle non-JSON error responses gracefully
205-
try:
206-
err = e.response.json()
207-
if isinstance(err, dict):
208-
error_message = err.get('message', err.get('error', str(err)))
209-
else:
210-
error_message = str(err)
211-
except Exception:
212-
try:
213-
error_message = getattr(e.response, 'text', str(e))
214-
except Exception:
215-
error_message = str(e)
216-
logging.error("Finding {} failed with status-code {}, {}".format(id,
217-
getattr(e.response, 'status_code', 'unknown'),
218-
error_message))
219-
raise e
159+
frost_sta_client.utils.handle_server_error(e, 'Finding {}'.format(id))
220160
logging.debug('Received response: {}'.format(response.status_code))
221161
json_response = response.json()
222162
json_response['id'] = json_response['@iot.id']
@@ -231,22 +171,7 @@ def delete(self, entity):
231171
try:
232172
response = self.service.execute('delete', url)
233173
except requests.exceptions.HTTPError as e:
234-
# Handle non-JSON error responses gracefully
235-
try:
236-
err = e.response.json()
237-
if isinstance(err, dict):
238-
error_message = err.get('message', err.get('error', str(err)))
239-
else:
240-
error_message = str(err)
241-
except Exception:
242-
try:
243-
error_message = getattr(e.response, 'text', str(e))
244-
except Exception:
245-
error_message = str(e)
246-
logging.error("Deleting {} failed with status-code {}, {}".format(type(entity).__name__,
247-
getattr(e.response, 'status_code', 'unknown'),
248-
error_message))
249-
raise e
174+
frost_sta_client.utils.handle_server_error(e, 'Deleting {}'.format(type(entity).__name__))
250175
logging.debug('Received response: {}'.format(response.status_code))
251176

252177
def entity_path(self, id):

frost_sta_client/dao/observation.py

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,7 @@ def create(self, entity):
4646
try:
4747
response = self.service.execute('post', url, json=json_dict)
4848
except requests.exceptions.HTTPError as e:
49-
# Handle non-JSON error responses gracefully
50-
try:
51-
err = e.response.json()
52-
if isinstance(err, dict):
53-
error_message = err.get('message', err.get('error', str(err)))
54-
else:
55-
error_message = str(err)
56-
except Exception:
57-
try:
58-
error_message = getattr(e.response, 'text', str(e))
59-
except Exception:
60-
error_message = str(e)
61-
logging.error("Creating {} failed with status-code {}, {}".format("Data Array",
62-
getattr(e.response, 'status_code', 'unknown'),
63-
error_message))
64-
raise e
49+
frost_sta_client.utils.handle_server_error(e, 'Creating Data Array')
6550
response_text_as_list = json.loads(response.text)
6651
result = [frost_sta_client.model.observation.Observation(self_link=link) for link in response_text_as_list]
6752
return result

frost_sta_client/model/ext/entity_list.py

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,20 +55,7 @@ def __next__(self):
5555
try:
5656
response = self.service.execute('get', self.next_link)
5757
except requests.exceptions.HTTPError as e:
58-
# Handle non-JSON error responses gracefully
59-
try:
60-
err = e.response.json()
61-
if isinstance(err, dict):
62-
error_message = err.get('message', err.get('error', str(err)))
63-
else:
64-
error_message = str(err)
65-
except Exception:
66-
try:
67-
error_message = getattr(e.response, 'text', str(e))
68-
except Exception:
69-
error_message = str(e)
70-
logging.error("Query failed with status-code {}, {}".format(getattr(e.response, 'status_code', 'unknown'), error_message))
71-
raise e
58+
frost_sta_client.utils.handle_server_error(e, 'Query')
7259
logging.debug('Received response: {} from {}'.format(response.status_code, self.next_link))
7360
try:
7461
json_response = response.json()

frost_sta_client/query/query.py

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -146,20 +146,7 @@ def list(self, callback=None, step_size=None):
146146
try:
147147
response = self.service.execute('get', url)
148148
except requests.exceptions.HTTPError as e:
149-
# Try to extract a meaningful error message even if the response is not JSON
150-
try:
151-
err = e.response.json()
152-
if isinstance(err, dict):
153-
error_message = err.get('message', err.get('error', str(err)))
154-
else:
155-
error_message = str(err)
156-
except Exception:
157-
try:
158-
error_message = getattr(e.response, 'text', str(e))
159-
except Exception:
160-
error_message = str(e)
161-
logging.error("Query failed with status-code {}, {}".format(getattr(e.response, 'status_code', 'unknown'), error_message))
162-
raise e
149+
frost_sta_client.utils.handle_server_error(e, 'Query')
163150
logging.debug('Received response: {} from {}'.format(response.status_code, url))
164151
try:
165152
json_response = response.json()

frost_sta_client/utils.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,19 @@ def process_area(value):
120120
if value["type"] == "LineString":
121121
return geojson.geometry.LineString(value["coordinates"])
122122
raise ValueError("can only handle geojson of type Point, Polygon, Geometry or LineString")
123+
124+
def handle_server_error(error, failed_action):
125+
# Try to extract a meaningful error message even if the response is not JSON
126+
try:
127+
err = error.response.json()
128+
if isinstance(err, dict):
129+
error_message = err.get('message', err.get('error', str(err)))
130+
else:
131+
error_message = str(err)
132+
except Exception:
133+
try:
134+
error_message = getattr(error.response, 'text', str(error))
135+
except Exception:
136+
error_message = str(error)
137+
logging.error("{} failed with status-code {}, {}".format(failed_action, getattr(error.response, 'status_code', 'unknown'), error_message))
138+
raise error

0 commit comments

Comments
 (0)