errors.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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] ERROR: %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. }
  71. /*
  72. err.Fatal() is true if err's severity level is 0 or 1 (logger.ErrorLevel or logger.Silence)
  73. */
  74. func (self *Error) Fatal() (fatal bool) {
  75. if self.level < logger.WarnLevel {
  76. fatal = true
  77. }
  78. return
  79. }