error.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package dara
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "reflect"
  8. "strconv"
  9. "github.com/alibabacloud-go/tea/tea"
  10. )
  11. type BaseError interface {
  12. error
  13. GetName() *string
  14. GetCode() *string
  15. }
  16. type ResponseError interface {
  17. BaseError
  18. GetRetryAfter() *int64
  19. GetStatusCode() *int
  20. GetAccessDeniedDetail() map[string]interface{}
  21. GetDescription() *string
  22. GetData() map[string]interface{}
  23. }
  24. // SDKError struct is used save error code and message
  25. type SDKError struct {
  26. BaseError
  27. Code *string
  28. Name *string
  29. StatusCode *int
  30. Message *string
  31. Data *string
  32. Stack *string
  33. errMsg *string
  34. Description *string
  35. AccessDeniedDetail map[string]interface{}
  36. }
  37. // CastError is used for cast type fails
  38. type CastError struct {
  39. Message *string
  40. }
  41. func TeaSDKError(err error) error {
  42. if(err == nil) {
  43. return nil
  44. }
  45. if te, ok := err.(*SDKError); ok {
  46. return tea.NewSDKError(map[string]interface{}{
  47. "code": StringValue(te.Code),
  48. "statusCode": IntValue(te.StatusCode),
  49. "message": StringValue(te.Message),
  50. "data": te.Data,
  51. "description": StringValue(te.Description),
  52. "accessDeniedDetail": te.AccessDeniedDetail,
  53. })
  54. }
  55. if respErr, ok := err.(ResponseError); ok {
  56. return tea.NewSDKError(map[string]interface{}{
  57. "code": StringValue(respErr.GetCode()),
  58. "statusCode": IntValue(respErr.GetStatusCode()),
  59. "message": respErr.Error(),
  60. "description": StringValue(respErr.GetDescription()),
  61. "data": respErr.GetData(),
  62. "accessDeniedDetail": respErr.GetAccessDeniedDetail(),
  63. })
  64. }
  65. if baseErr, ok := err.(BaseError); ok {
  66. return tea.NewSDKError(map[string]interface{}{
  67. "code": StringValue(baseErr.GetCode()),
  68. "message": baseErr.Error(),
  69. })
  70. }
  71. return err
  72. }
  73. // NewSDKError is used for shortly create SDKError object
  74. func NewSDKError(obj map[string]interface{}) *SDKError {
  75. err := &SDKError{}
  76. err.Name = String("BaseError")
  77. if val, ok := obj["code"].(int); ok {
  78. err.Code = String(strconv.Itoa(val))
  79. } else if val, ok := obj["code"].(string); ok {
  80. err.Code = String(val)
  81. }
  82. if obj["message"] != nil {
  83. err.Message = String(obj["message"].(string))
  84. }
  85. if obj["name"] != nil {
  86. }
  87. if obj["description"] != nil {
  88. err.Description = String(obj["description"].(string))
  89. }
  90. if detail := obj["accessDeniedDetail"]; detail != nil {
  91. r := reflect.ValueOf(detail)
  92. if r.Kind().String() == "map" {
  93. res := make(map[string]interface{})
  94. tmp := r.MapKeys()
  95. for _, key := range tmp {
  96. res[key.String()] = r.MapIndex(key).Interface()
  97. }
  98. err.AccessDeniedDetail = res
  99. }
  100. }
  101. if data := obj["data"]; data != nil {
  102. r := reflect.ValueOf(data)
  103. if r.Kind().String() == "map" {
  104. res := make(map[string]interface{})
  105. tmp := r.MapKeys()
  106. for _, key := range tmp {
  107. res[key.String()] = r.MapIndex(key).Interface()
  108. }
  109. if statusCode := res["statusCode"]; statusCode != nil {
  110. if code, ok := statusCode.(int); ok {
  111. err.StatusCode = Int(code)
  112. } else if tmp, ok := statusCode.(string); ok {
  113. code, err_ := strconv.Atoi(tmp)
  114. if err_ == nil {
  115. err.StatusCode = Int(code)
  116. }
  117. } else if code, ok := statusCode.(*int); ok {
  118. err.StatusCode = code
  119. }
  120. }
  121. }
  122. byt := bytes.NewBuffer([]byte{})
  123. jsonEncoder := json.NewEncoder(byt)
  124. jsonEncoder.SetEscapeHTML(false)
  125. jsonEncoder.Encode(data)
  126. err.Data = String(string(bytes.TrimSpace(byt.Bytes())))
  127. }
  128. if statusCode, ok := obj["statusCode"].(int); ok {
  129. err.StatusCode = Int(statusCode)
  130. } else if status, ok := obj["statusCode"].(string); ok {
  131. statusCode, err_ := strconv.Atoi(status)
  132. if err_ == nil {
  133. err.StatusCode = Int(statusCode)
  134. }
  135. }
  136. return err
  137. }
  138. func (err *SDKError) ErrorName() *string {
  139. return err.Name
  140. }
  141. func (err *SDKError) ErrorMessage() *string {
  142. return err.Message
  143. }
  144. func (err *SDKError) GetCode() *string {
  145. return err.Code
  146. }
  147. // Set ErrMsg by msg
  148. func (err *SDKError) SetErrMsg(msg string) {
  149. err.errMsg = String(msg)
  150. }
  151. func (err *SDKError) Error() string {
  152. if err.errMsg == nil {
  153. str := fmt.Sprintf("SDKError:\n StatusCode: %d\n Code: %s\n Message: %s\n Data: %s\n",
  154. IntValue(err.StatusCode), StringValue(err.Code), StringValue(err.Message), StringValue(err.Data))
  155. err.SetErrMsg(str)
  156. }
  157. return StringValue(err.errMsg)
  158. }
  159. // Return message of CastError
  160. func (err *CastError) Error() string {
  161. return StringValue(err.Message)
  162. }
  163. func Retryable(err error) *bool {
  164. if err == nil {
  165. return Bool(false)
  166. }
  167. if realErr, ok := err.(*SDKError); ok {
  168. if realErr.StatusCode == nil {
  169. return Bool(false)
  170. }
  171. code := IntValue(realErr.StatusCode)
  172. return Bool(code >= http.StatusInternalServerError)
  173. }
  174. return Bool(true)
  175. }
  176. // NewCastError is used for cast type fails
  177. func NewCastError(message *string) (err error) {
  178. return &CastError{
  179. Message: message,
  180. }
  181. }