errors.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package errs
  2. import (
  3. "fmt"
  4. "github.com/ethereum/go-ethereum/logger"
  5. "github.com/ethereum/go-ethereum/logger/glog"
  6. )
  7. /*
  8. Errors implements an error handler providing standardised errors for a package.
  9. Fields:
  10. Errors:
  11. a map from error codes to description
  12. Package:
  13. name of the package/component
  14. Level:
  15. a function mapping error code to logger.LogLevel (severity)
  16. if not given, errors default to logger.InfoLevel
  17. */
  18. type Errors struct {
  19. Errors map[int]string
  20. Package string
  21. Level func(code int) logger.LogLevel
  22. }
  23. /*
  24. Error implements the standard go error interface.
  25. errors.New(code, format, params ...interface{})
  26. Prints as:
  27. [package] description: details
  28. where details is fmt.Sprintf(self.format, self.params...)
  29. */
  30. type Error struct {
  31. Code int
  32. Name string
  33. Package string
  34. level logger.LogLevel
  35. message string
  36. format string
  37. params []interface{}
  38. }
  39. func (self *Errors) New(code int, format string, params ...interface{}) *Error {
  40. name, ok := self.Errors[code]
  41. if !ok {
  42. panic("invalid error code")
  43. }
  44. level := logger.InfoLevel
  45. if self.Level != nil {
  46. level = self.Level(code)
  47. }
  48. return &Error{
  49. Code: code,
  50. Name: name,
  51. Package: self.Package,
  52. level: level,
  53. format: format,
  54. params: params,
  55. }
  56. }
  57. func (self Error) Error() (message string) {
  58. if len(message) == 0 {
  59. self.message = fmt.Sprintf("[%s] %s", self.Package, self.Name)
  60. if self.format != "" {
  61. self.message += ": " + fmt.Sprintf(self.format, self.params...)
  62. }
  63. }
  64. return self.message
  65. }
  66. func (self Error) Log(v glog.Verbose) {
  67. if v {
  68. v.Infoln(self)
  69. }
  70. //log.Sendln(self.level, self)
  71. }
  72. /*
  73. func (self Error) Log(log *logger.Logger) {
  74. log.Sendln(self.level, self)
  75. }
  76. */
  77. /*
  78. err.Fatal() is true if err's severity level is 0 or 1 (logger.ErrorLevel or logger.Silence)
  79. */
  80. func (self *Error) Fatal() (fatal bool) {
  81. if self.level < logger.WarnLevel {
  82. fatal = true
  83. }
  84. return
  85. }