@@ -348,19 +348,21 @@ def _check_rest_response_for_error(
348
348
response_data: Raw response data
349
349
350
350
Raises:
351
- Various exceptions based on the error type
351
+ RequestError: If the response indicates an error
352
352
"""
353
353
if status_code >= 400 :
354
354
error_message = f"REST HTTP request failed with status { status_code } "
355
355
error_code = None
356
-
356
+
357
357
# Try to extract error details from JSON response
358
358
if response_data :
359
359
try :
360
360
error_details = json .loads (response_data .decode ("utf-8" ))
361
361
if isinstance (error_details , dict ):
362
362
if "message" in error_details :
363
- error_message = f"{ error_message } : { error_details ['message' ]} "
363
+ error_message = (
364
+ f"{ error_message } : { error_details ['message' ]} "
365
+ )
364
366
if "error_code" in error_details :
365
367
error_code = error_details ["error_code" ]
366
368
elif "errorCode" in error_details :
@@ -376,64 +378,68 @@ def _check_rest_response_for_error(
376
378
logger .error (f"Request failed (status { status_code } ): No response data" )
377
379
378
380
from databricks .sql .exc import (
379
- RequestError ,
380
- OperationalError ,
381
+ RequestError ,
382
+ OperationalError ,
381
383
DatabaseError ,
382
384
SessionAlreadyClosedError ,
383
385
CursorAlreadyClosedError ,
384
- NonRecoverableNetworkError ,
385
- UnsafeToRetryError
386
386
)
387
-
388
- # Map HTTP status codes to appropriate exceptions
387
+
388
+ # Map status codes to appropriate exceptions to match Thrift behavior
389
389
if status_code == 429 :
390
- # Rate limiting errors - similar to what ThriftDatabricksClient does
390
+ # Rate limiting errors
391
391
retry_after = None
392
392
if self .headers and "Retry-After" in self .headers :
393
393
retry_after = self .headers ["Retry-After" ]
394
-
394
+
395
395
rate_limit_msg = f"Maximum rate has been exceeded. Please reduce the rate of requests and try again"
396
396
if retry_after :
397
397
rate_limit_msg += f" after { retry_after } seconds."
398
398
raise RequestError (rate_limit_msg )
399
-
399
+
400
400
elif status_code == 503 :
401
401
# Service unavailable errors
402
- raise OperationalError ("TEMPORARILY_UNAVAILABLE: Service temporarily unavailable" )
403
-
402
+ raise OperationalError (
403
+ "TEMPORARILY_UNAVAILABLE: Service temporarily unavailable"
404
+ )
405
+
404
406
elif status_code == 404 :
405
407
# Not found errors - could be session or operation already closed
406
408
if error_message and "session" in error_message .lower ():
407
- raise SessionAlreadyClosedError ("Session was closed by a prior request" )
408
- elif error_message and ("operation" in error_message .lower () or "statement" in error_message .lower ()):
409
- raise CursorAlreadyClosedError ("Operation was canceled by a prior request" )
409
+ raise SessionAlreadyClosedError (
410
+ "Session was closed by a prior request"
411
+ )
412
+ elif error_message and (
413
+ "operation" in error_message .lower ()
414
+ or "statement" in error_message .lower ()
415
+ ):
416
+ raise CursorAlreadyClosedError (
417
+ "Operation was canceled by a prior request"
418
+ )
410
419
else :
411
420
raise RequestError (error_message )
412
-
421
+
413
422
elif status_code == 401 :
414
423
# Authentication errors
415
- raise OperationalError ("Authentication failed. Please check your credentials." )
416
-
424
+ raise OperationalError (
425
+ "Authentication failed. Please check your credentials."
426
+ )
427
+
417
428
elif status_code == 403 :
418
429
# Permission errors
419
- raise OperationalError ("Permission denied. You do not have access to this resource." )
420
-
430
+ raise OperationalError (
431
+ "Permission denied. You do not have access to this resource."
432
+ )
433
+
421
434
elif status_code == 400 :
422
435
# Bad request errors - often syntax errors
423
436
if error_message and "syntax" in error_message .lower ():
424
- raise DatabaseError (f"Syntax error in SQL statement: { error_message } " )
437
+ raise DatabaseError (
438
+ f"Syntax error in SQL statement: { error_message } "
439
+ )
425
440
else :
426
441
raise RequestError (error_message )
427
-
428
- elif status_code == 501 :
429
- # Not implemented errors
430
- raise NonRecoverableNetworkError (f"Not implemented: { error_message } " )
431
-
432
- elif status_code == 502 or status_code == 504 :
433
- # Bad gateway or gateway timeout errors
434
- # These are considered dangerous to retry for ExecuteStatement
435
- raise UnsafeToRetryError (f"Gateway error: { error_message } " )
436
-
442
+
437
443
else :
438
444
# Generic errors
439
445
raise RequestError (error_message )
0 commit comments