Skip to content

Commit 7f0b9bd

Browse files
ml-evsclaude
andcommitted
Add specialized error handling for common HTTP status codes
- 401/403: Authentication guidance with API key setup instructions - 404: Helpful message about checking URL/endpoint correctness - 429: Rate limiting guidance - 500: Server bug reporting with server version info - 502: Gateway connectivity issues - 503: Service unavailable with deployment issue reporting - 504: Gateway timeout guidance - Show response content for JSON parsing errors on successful responses 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 2c738f2 commit 7f0b9bd

File tree

1 file changed

+61
-10
lines changed

1 file changed

+61
-10
lines changed

src/datalab_api/_base.py

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class DatalabAPIError(Exception):
1818
class DuplicateItemError(DatalabAPIError):
1919
"""Raised when the API operation would create a duplicate item."""
2020

21+
2122
__version__ = version("datalab-api")
2223

2324
__all__ = ("BaseDatalabClient", "__version__")
@@ -230,30 +231,80 @@ def _handle_response(
230231
DuplicateItemError: For 409 conflicts or duplicate key errors
231232
DatalabAPIError: For other API errors
232233
"""
233-
# Handle HTTP status code errors
234-
if response.status_code != expected_status:
234+
# Handle authentication errors first
235+
if response.status_code in (401, 403):
236+
auth_help = (
237+
"Authentication failed. Please check your API key and ensure it's set correctly. "
238+
"You can set your API key using the DATALAB_API_KEY environment variable or "
239+
"the instance-specific <PREFIX>_DATALAB_API_KEY variable."
240+
)
235241
try:
236242
error_data = response.json()
237243
error_message = error_data.get("message", str(response.content))
244+
except ValueError:
245+
error_message = str(response.content)
246+
raise DatalabAPIError(
247+
f"HTTP {response.status_code} error at {url}: {error_message}. {auth_help}"
248+
)
238249

239-
# Handle specific error cases
240-
if response.status_code == 409:
241-
raise DuplicateItemError(f"Duplicate item error at {url}: {error_message}")
250+
# Handle other HTTP status code errors
251+
if response.status_code != expected_status:
252+
try:
253+
error_data = response.json()
254+
error_message = error_data.get("message", str(response.content))
255+
except ValueError:
256+
error_message = str(response.content)
242257

258+
# Handle specific error cases with helpful messages
259+
if response.status_code == 404:
243260
raise DatalabAPIError(
244-
f"HTTP {response.status_code} error at {url}: {error_message}"
261+
f"HTTP 404 Not Found at {url}: {error_message}. "
262+
"Please check the URL/endpoint is correct and the resource exists."
245263
)
246-
except ValueError:
247-
# Response is not JSON
264+
elif response.status_code == 409:
265+
raise DuplicateItemError(f"Duplicate item error at {url}: {error_message}")
266+
elif response.status_code == 429:
248267
raise DatalabAPIError(
249-
f"HTTP {response.status_code} error at {url}: {response.content}"
268+
f"HTTP 429 Too Many Requests at {url}: {error_message}. "
269+
"You are being rate limited. Please wait before making more requests."
270+
)
271+
elif response.status_code == 500:
272+
server_info = ""
273+
if hasattr(self, "_datalab_server_version"):
274+
server_info = f" (Server version: {self._datalab_server_version})"
275+
raise DatalabAPIError(
276+
f"HTTP 500 Internal Server Error at {url}: {error_message}{server_info}. "
277+
"This is a server-side bug. Please report this issue to the datalab developers "
278+
"at https://github.com/datalab-org/datalab/issues with the full error message."
279+
)
280+
elif response.status_code == 502:
281+
raise DatalabAPIError(
282+
f"HTTP 502 Bad Gateway at {url}: {error_message}. "
283+
"The server is having connectivity issues. Please try again later."
284+
)
285+
elif response.status_code == 503:
286+
raise DatalabAPIError(
287+
f"HTTP 503 Service Unavailable at {url}: {error_message}. "
288+
"The datalab service is temporarily unavailable. Please report deployment "
289+
"issues to your datalab instance maintainer."
290+
)
291+
elif response.status_code == 504:
292+
raise DatalabAPIError(
293+
f"HTTP 504 Gateway Timeout at {url}: {error_message}. "
294+
"The request timed out. Please try again or check if the operation is taking too long."
295+
)
296+
else:
297+
raise DatalabAPIError(
298+
f"HTTP {response.status_code} error at {url}: {error_message}"
250299
)
251300

252301
# Parse JSON response
253302
try:
254303
data = response.json()
255304
except ValueError as e:
256-
raise DatalabAPIError(f"Invalid JSON response from {url}: {e}")
305+
raise DatalabAPIError(
306+
f"Invalid JSON response from {url}: {e}. Response content: {response.content}"
307+
)
257308

258309
# Handle API-level status errors
259310
if isinstance(data, dict) and data.get("status") != "success":

0 commit comments

Comments
 (0)