error.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package error
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. )
  6. var errors map[int]string
  7. const (
  8. EcodeKeyNotFound = 100
  9. EcodeTestFailed = 101
  10. EcodeNotFile = 102
  11. EcodeNoMoreMachine = 103
  12. EcodeNotDir = 104
  13. EcodeNodeExist = 105
  14. EcodeKeyIsPreserved = 106
  15. EcodeValueRequired = 200
  16. EcodePrevValueRequired = 201
  17. EcodeTTLNaN = 202
  18. EcodeIndexNaN = 203
  19. EcodeRaftInternal = 300
  20. EcodeLeaderElect = 301
  21. EcodeWatcherCleared = 400
  22. EcodeEventIndexCleared = 401
  23. )
  24. func init() {
  25. errors = make(map[int]string)
  26. // command related errors
  27. errors[EcodeKeyNotFound] = "Key Not Found"
  28. errors[EcodeTestFailed] = "Test Failed" //test and set
  29. errors[EcodeNotFile] = "Not A File"
  30. errors[EcodeNoMoreMachine] = "Reached the max number of machines in the cluster"
  31. errors[EcodeNotDir] = "Not A Directory"
  32. errors[EcodeNodeExist] = "Already exists" // create
  33. errors[EcodeKeyIsPreserved] = "The prefix of given key is a keyword in etcd"
  34. // Post form related errors
  35. errors[EcodeValueRequired] = "Value is Required in POST form"
  36. errors[EcodePrevValueRequired] = "PrevValue is Required in POST form"
  37. errors[EcodeTTLNaN] = "The given TTL in POST form is not a number"
  38. errors[EcodeIndexNaN] = "The given index in POST form is not a number"
  39. // raft related errors
  40. errors[EcodeRaftInternal] = "Raft Internal Error"
  41. errors[EcodeLeaderElect] = "During Leader Election"
  42. // etcd related errors
  43. errors[EcodeWatcherCleared] = "watcher is cleared due to etcd recovery"
  44. errors[EcodeEventIndexCleared] = "The event in requested index is outdated and cleared"
  45. }
  46. type Error struct {
  47. ErrorCode int `json:"errorCode"`
  48. Message string `json:"message"`
  49. Cause string `json:"cause,omitempty"`
  50. }
  51. func NewError(errorCode int, cause string) Error {
  52. return Error{
  53. ErrorCode: errorCode,
  54. Message: errors[errorCode],
  55. Cause: cause,
  56. }
  57. }
  58. func Message(code int) string {
  59. return errors[code]
  60. }
  61. // Only for error interface
  62. func (e Error) Error() string {
  63. return e.Message
  64. }
  65. func (e Error) toJsonString() string {
  66. b, _ := json.Marshal(e)
  67. return string(b)
  68. }
  69. func (e Error) Write(w http.ResponseWriter) {
  70. // 3xx is reft internal error
  71. if e.ErrorCode/100 == 3 {
  72. http.Error(w, e.toJsonString(), http.StatusInternalServerError)
  73. } else {
  74. http.Error(w, e.toJsonString(), http.StatusBadRequest)
  75. }
  76. }