errors.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package errors
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. const UnknownError = "UNKNOWN"
  7. type WTError interface {
  8. /* 标记类操作 */
  9. error
  10. WTError() // 标记
  11. /* 访问类操作 */
  12. Code() string
  13. Message() string
  14. Stack() string
  15. Cause() error
  16. /* 设置类操作 */
  17. SetCode(code string) WTError
  18. SetCodeForce(code string) WTError
  19. SetCause(cause error) WTError
  20. SetCauseForce(cause error) WTError
  21. Warp(format string, a ...any) WTError
  22. }
  23. type wtError struct {
  24. cause error
  25. msg string
  26. code string
  27. stack string
  28. }
  29. func (*wtError) WTError() {}
  30. func (w *wtError) Code() string {
  31. return w.code
  32. }
  33. func (w *wtError) Message() string {
  34. if w.cause == nil {
  35. return fmt.Sprintf("[%s] %s", w.code, w.msg)
  36. }
  37. var cause *wtError
  38. ok := errors.As(w.cause, &cause)
  39. if ok {
  40. return fmt.Sprintf("[%s] %s: %s", w.code, w.msg, cause.Message())
  41. }
  42. return fmt.Sprintf("[%s] %s: %s", w.code, w.msg, w.cause.Error())
  43. }
  44. func (w *wtError) Stack() string {
  45. return w.stack
  46. }
  47. func (w *wtError) Error() string {
  48. return w.Message()
  49. }
  50. func (w *wtError) Cause() error {
  51. return w.cause
  52. }
  53. func (w *wtError) SetCode(code string) WTError {
  54. if w.code == UnknownError {
  55. w.code = code
  56. }
  57. return w
  58. }
  59. func (w *wtError) SetCodeForce(code string) WTError {
  60. w.code = code
  61. return w
  62. }
  63. func (w *wtError) SetCause(cause error) WTError {
  64. if w.cause == nil {
  65. w.cause = cause
  66. _ = w.SetCode(getErrorName(cause))
  67. }
  68. return w
  69. }
  70. func (w *wtError) SetCauseForce(cause error) WTError {
  71. w.cause = cause
  72. _ = w.SetCode(getErrorName(cause))
  73. return w
  74. }
  75. func (w *wtError) Warp(format string, a ...any) WTError {
  76. return Warp(w, format, a...)
  77. }