86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
|
|
from Tea.exceptions import UnretryableException as TeaUnretryableException
|
||
|
|
from Tea.exceptions import RequiredArgumentException as TeaRequiredArgumentException
|
||
|
|
from Tea.exceptions import TeaException
|
||
|
|
from darabonba.policy.retry import RetryPolicyContext
|
||
|
|
from typing import Any, Optional
|
||
|
|
|
||
|
|
|
||
|
|
class DaraException(TeaException):
|
||
|
|
def __init__(self, dic):
|
||
|
|
super().__init__(dic)
|
||
|
|
self.code = dic.get("code")
|
||
|
|
self.message = dic.get("message")
|
||
|
|
self.data = dic.get("data")
|
||
|
|
self.description = dic.get("description")
|
||
|
|
self.accessDeniedDetail = dic.get("accessDeniedDetail")
|
||
|
|
if isinstance(dic.get("data"), dict) and dic.get("data").get("statusCode") is not None:
|
||
|
|
self.statusCode = dic.get("data").get("statusCode")
|
||
|
|
self.name = 'DaraException'
|
||
|
|
|
||
|
|
def __str__(self):
|
||
|
|
return f'Error: {self.code} {self.message} Response: {self.data}'
|
||
|
|
|
||
|
|
class ResponseException(DaraException):
|
||
|
|
def __init__(self,
|
||
|
|
code: Optional[str] = None,
|
||
|
|
message: Optional[str] = None,
|
||
|
|
status_code: Optional[int] = None,
|
||
|
|
retry_after: Optional[int] = None,
|
||
|
|
data: Optional[dict] = None,
|
||
|
|
access_denied_detail: Optional[dict] = None,
|
||
|
|
description: Optional[str] = None,
|
||
|
|
stack: Optional[str] = None):
|
||
|
|
if data and status_code is not None:
|
||
|
|
data['statusCode'] = status_code
|
||
|
|
super().__init__({
|
||
|
|
'code': code,
|
||
|
|
'message': message,
|
||
|
|
'data': data,
|
||
|
|
'description': description,
|
||
|
|
'accessDeniedDetail': access_denied_detail
|
||
|
|
})
|
||
|
|
|
||
|
|
self.name = 'ResponseException'
|
||
|
|
self.status_code = status_code
|
||
|
|
self.retry_after = retry_after
|
||
|
|
self.stack = stack
|
||
|
|
|
||
|
|
class ValidateException(Exception):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class RequiredArgumentException(TeaRequiredArgumentException):
|
||
|
|
def __init__(self, arg):
|
||
|
|
self.arg = arg
|
||
|
|
|
||
|
|
def __str__(self):
|
||
|
|
return f'"{self.arg}" is required.'
|
||
|
|
|
||
|
|
|
||
|
|
class RetryError(Exception):
|
||
|
|
def __init__(self, message):
|
||
|
|
|
||
|
|
super().__init__({"message":message})
|
||
|
|
|
||
|
|
self.message = message
|
||
|
|
self.data = None
|
||
|
|
self.name = 'RetryError'
|
||
|
|
|
||
|
|
class UnretryableException(TeaUnretryableException):
|
||
|
|
def __init__(
|
||
|
|
self,
|
||
|
|
_context: RetryPolicyContext
|
||
|
|
):
|
||
|
|
if isinstance(_context.exception, ResponseException):
|
||
|
|
raise _context.exception
|
||
|
|
|
||
|
|
super().__init__(
|
||
|
|
request= _context.http_request,
|
||
|
|
ex= _context.exception,
|
||
|
|
)
|
||
|
|
|
||
|
|
self.name = 'UnretryableException'
|
||
|
|
|
||
|
|
|
||
|
|
def __str__(self):
|
||
|
|
return str(self.inner_exception)
|