mirror of https://github.com/ethereum/go-ethereum
parent
52ccaa605e
commit
d46c7bcaf9
@ -0,0 +1,91 @@ |
||||
package errs |
||||
|
||||
import ( |
||||
"fmt" |
||||
|
||||
"github.com/ethereum/go-ethereum/logger" |
||||
) |
||||
|
||||
/* |
||||
Errors implements an error handler providing standardised errors for a package. |
||||
Fields: |
||||
|
||||
Errors: |
||||
a map from error codes to description |
||||
|
||||
Package: |
||||
name of the package/component |
||||
|
||||
Level: |
||||
a function mapping error code to logger.LogLevel (severity) |
||||
if not given, errors default to logger.InfoLevel |
||||
*/ |
||||
type Errors struct { |
||||
Errors map[int]string |
||||
Package string |
||||
Level func(code int) logger.LogLevel |
||||
} |
||||
|
||||
/* |
||||
Error implements the standard go error interface. |
||||
|
||||
errors.New(code, format, params ...interface{}) |
||||
|
||||
Prints as: |
||||
|
||||
[package] description: details |
||||
|
||||
where details is fmt.Sprintf(self.format, self.params...) |
||||
*/ |
||||
type Error struct { |
||||
Code int |
||||
Name string |
||||
Package string |
||||
level logger.LogLevel |
||||
message string |
||||
format string |
||||
params []interface{} |
||||
} |
||||
|
||||
func (self *Errors) New(code int, format string, params ...interface{}) *Error { |
||||
name, ok := self.Errors[code] |
||||
if !ok { |
||||
panic("invalid error code") |
||||
} |
||||
level := logger.InfoLevel |
||||
if self.Level != nil { |
||||
level = self.Level(code) |
||||
} |
||||
return &Error{ |
||||
Code: code, |
||||
Name: name, |
||||
Package: self.Package, |
||||
level: level, |
||||
format: format, |
||||
params: params, |
||||
} |
||||
} |
||||
|
||||
func (self Error) Error() (message string) { |
||||
if len(message) == 0 { |
||||
self.message = fmt.Sprintf("[%s] %s", self.Package, self.Name) |
||||
if self.format != "" { |
||||
self.message += ": " + fmt.Sprintf(self.format, self.params...) |
||||
} |
||||
} |
||||
return self.message |
||||
} |
||||
|
||||
func (self Error) Log(log *logger.Logger) { |
||||
log.Sendln(self.level, self) |
||||
} |
||||
|
||||
/* |
||||
err.Fatal() is true if err's severity level is 0 or 1 (logger.ErrorLevel or logger.Silence) |
||||
*/ |
||||
func (self *Error) Fatal() (fatal bool) { |
||||
if self.level < logger.WarnLevel { |
||||
fatal = true |
||||
} |
||||
return |
||||
} |
@ -0,0 +1,46 @@ |
||||
package errs |
||||
|
||||
import ( |
||||
"fmt" |
||||
"testing" |
||||
|
||||
"github.com/ethereum/go-ethereum/logger" |
||||
) |
||||
|
||||
func testErrors() *Errors { |
||||
return &Errors{ |
||||
Package: "TEST", |
||||
Errors: map[int]string{ |
||||
0: "zero", |
||||
1: "one", |
||||
}, |
||||
Level: func(i int) (l logger.LogLevel) { |
||||
if i == 0 { |
||||
l = logger.ErrorLevel |
||||
} else { |
||||
l = logger.WarnLevel |
||||
} |
||||
return |
||||
}, |
||||
} |
||||
} |
||||
|
||||
func TestErrorMessage(t *testing.T) { |
||||
err := testErrors().New(0, "zero detail %v", "available") |
||||
message := fmt.Sprintf("%v", err) |
||||
exp := "[TEST] zero: zero detail available" |
||||
if message != exp { |
||||
t.Errorf("error message incorrect. expected %v, got %v", exp, message) |
||||
} |
||||
} |
||||
|
||||
func TestErrorSeverity(t *testing.T) { |
||||
err0 := testErrors().New(0, "zero detail") |
||||
if !err0.Fatal() { |
||||
t.Errorf("error should be fatal") |
||||
} |
||||
err1 := testErrors().New(1, "one detail") |
||||
if err1.Fatal() { |
||||
t.Errorf("error should not be fatal") |
||||
} |
||||
} |
Loading…
Reference in new issue