errors.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package fserr
  2. import (
  3. "fmt"
  4. "io"
  5. )
  6. type fundamental struct {
  7. msg string
  8. *stack
  9. }
  10. func (f *fundamental) Error() string { return f.msg }
  11. func (f *fundamental) Format(s fmt.State, verb rune) {
  12. switch verb {
  13. case 'v':
  14. if s.Flag('+') {
  15. _, _ = io.WriteString(s, f.msg)
  16. f.stack.Format(s, verb)
  17. return
  18. }
  19. fallthrough
  20. case 's':
  21. _, _ = io.WriteString(s, f.msg)
  22. case 'q':
  23. _, _ = fmt.Fprintf(s, "%q", f.msg)
  24. }
  25. }
  26. type withStack struct {
  27. error
  28. *stack
  29. }
  30. func (w *withStack) Cause() error { return w.error }
  31. func (w *withStack) Unwrap() error { return w.error }
  32. func (w *withStack) Format(s fmt.State, verb rune) {
  33. switch verb {
  34. case 'v':
  35. if s.Flag('+') {
  36. _, _ = fmt.Fprintf(s, "%+v", w.Cause())
  37. w.stack.Format(s, verb)
  38. return
  39. }
  40. fallthrough
  41. case 's':
  42. _, _ = io.WriteString(s, w.Error())
  43. case 'q':
  44. _, _ = fmt.Fprintf(s, "%q", w.Error())
  45. }
  46. }
  47. type withMessage struct {
  48. cause error
  49. msg string
  50. }
  51. func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() }
  52. func (w *withMessage) Cause() error { return w.cause }
  53. func (w *withMessage) Unwrap() error { return w.cause }
  54. func (w *withMessage) Format(s fmt.State, verb rune) {
  55. switch verb {
  56. case 'v':
  57. if s.Flag('+') {
  58. _, _ = io.WriteString(s, w.msg+": ")
  59. _, _ = fmt.Fprintf(s, "%+v\n", w.Cause())
  60. return
  61. }
  62. fallthrough
  63. case 's', 'q':
  64. _, _ = io.WriteString(s, w.Error())
  65. }
  66. }
  67. type withCode struct {
  68. cause error
  69. Msg string `json:"msg"`
  70. HttpCode int `json:"httpCode"`
  71. BusinessCode string `json:"businessCode"`
  72. }
  73. func (w *withCode) Error() string { return w.Msg }
  74. func (w *withCode) Cause() error { return w.cause }
  75. func (w *withCode) Unwrap() error { return w.cause }
  76. func (w *withCode) Format(s fmt.State, verb rune) {
  77. switch verb {
  78. case 'v':
  79. if s.Flag('+') {
  80. _, _ = io.WriteString(s, w.Msg+"\n")
  81. _, _ = fmt.Fprintf(s, "%+v\n", w.Cause())
  82. return
  83. }
  84. fallthrough
  85. case 's', 'q':
  86. _, _ = io.WriteString(s, w.Error())
  87. }
  88. }