Use new tmlibs/common.Error for sdk.Error

This commit is contained in:
Jae Kwon 2018-06-07 03:24:09 -07:00 committed by Ethan Buchman
parent 12f71876e8
commit 7487f67346
5 changed files with 45 additions and 61 deletions

View File

@ -87,7 +87,6 @@ func NewBaseApp(name string, cdc *wire.Codec, logger log.Logger, db dbm.DB) *Bas
txDecoder: defaultTxDecoder(cdc), txDecoder: defaultTxDecoder(cdc),
} }
// Register the undefined & root codespaces, which should not be used by any modules // Register the undefined & root codespaces, which should not be used by any modules
app.codespacer.RegisterOrPanic(sdk.CodespaceUndefined)
app.codespacer.RegisterOrPanic(sdk.CodespaceRoot) app.codespacer.RegisterOrPanic(sdk.CodespaceRoot)
return app return app
} }
@ -137,7 +136,7 @@ func defaultTxDecoder(cdc *wire.Codec) sdk.TxDecoder {
// are registered by MakeTxCodec // are registered by MakeTxCodec
err := cdc.UnmarshalBinary(txBytes, &tx) err := cdc.UnmarshalBinary(txBytes, &tx)
if err != nil { if err != nil {
return nil, sdk.ErrTxDecode("").Trace(err.Error()) return nil, sdk.ErrTxDecode("").TraceSDK(err.Error())
} }
return tx, nil return tx, nil
} }
@ -486,7 +485,6 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk
// Validate the Msg. // Validate the Msg.
err := msg.ValidateBasic() err := msg.ValidateBasic()
if err != nil { if err != nil {
err = err.WithDefaultCodespace(sdk.CodespaceRoot)
return err.Result() return err.Result()
} }

View File

@ -41,13 +41,13 @@ func (msg MsgSetTrend) String() string {
// Validate Basic is used to quickly disqualify obviously invalid messages quickly // Validate Basic is used to quickly disqualify obviously invalid messages quickly
func (msg MsgSetTrend) ValidateBasic() sdk.Error { func (msg MsgSetTrend) ValidateBasic() sdk.Error {
if len(msg.Sender) == 0 { if len(msg.Sender) == 0 {
return sdk.ErrUnknownAddress(msg.Sender.String()).Trace("") return sdk.ErrUnknownAddress(msg.Sender.String()).TraceSDK("")
} }
if strings.Contains(msg.Cool, "hot") { if strings.Contains(msg.Cool, "hot") {
return sdk.ErrUnauthorized("").Trace("hot is not cool") return sdk.ErrUnauthorized("").TraceSDK("hot is not cool")
} }
if strings.Contains(msg.Cool, "warm") { if strings.Contains(msg.Cool, "warm") {
return sdk.ErrUnauthorized("").Trace("warm is not very cool") return sdk.ErrUnauthorized("").TraceSDK("warm is not very cool")
} }
return nil return nil
} }
@ -91,7 +91,7 @@ func (msg MsgQuiz) String() string {
// Validate Basic is used to quickly disqualify obviously invalid messages quickly // Validate Basic is used to quickly disqualify obviously invalid messages quickly
func (msg MsgQuiz) ValidateBasic() sdk.Error { func (msg MsgQuiz) ValidateBasic() sdk.Error {
if len(msg.Sender) == 0 { if len(msg.Sender) == 0 {
return sdk.ErrUnknownAddress(msg.Sender.String()).Trace("") return sdk.ErrUnknownAddress(msg.Sender.String()).TraceSDK("")
} }
return nil return nil
} }

View File

@ -55,10 +55,7 @@ const (
CodeOutOfGas CodeType = 12 CodeOutOfGas CodeType = 12
// CodespaceRoot is a codespace for error codes in this file only. // CodespaceRoot is a codespace for error codes in this file only.
// Notice that 0 is an "unset" codespace, which can be overridden with CodespaceRoot CodespaceType = 1
// Error.WithDefaultCodespace().
CodespaceUndefined CodespaceType = 0
CodespaceRoot CodespaceType = 1
// Maximum reservable codespace (2^16 - 1) // Maximum reservable codespace (2^16 - 1)
MaximumCodespace CodespaceType = 65535 MaximumCodespace CodespaceType = 65535
@ -141,49 +138,64 @@ func ErrOutOfGas(msg string) Error {
//---------------------------------------- //----------------------------------------
// Error & sdkError // Error & sdkError
type cmnError = cmn.Error
// sdk Error type // sdk Error type
type Error interface { type Error interface {
Error() string // Implements cmn.Error
// Error() string
// Stacktrace() cmn.Error
// Trace(offset int, format string, args ...interface{}) cmn.Error
// Data() interface{}
cmnError
// convenience
TraceSDK(format string, args ...interface{}) Error
Code() CodeType Code() CodeType
Codespace() CodespaceType Codespace() CodespaceType
ABCILog() string ABCILog() string
ABCICode() ABCICodeType ABCICode() ABCICodeType
WithDefaultCodespace(codespace CodespaceType) Error
Trace(msg string) Error
T() interface{}
Result() Result Result() Result
QueryResult() abci.ResponseQuery QueryResult() abci.ResponseQuery
} }
// NewError - create an error // NewError - create an error.
func NewError(codespace CodespaceType, code CodeType, msg string) Error { func NewError(codespace CodespaceType, code CodeType, format string, args ...interface{}) Error {
return newError(codespace, code, msg) return newError(codespace, code, format, args...)
} }
func newErrorWithRootCodespace(code CodeType, msg string) *sdkError { func newErrorWithRootCodespace(code CodeType, format string, args ...interface{}) *sdkError {
return newError(CodespaceRoot, code, msg) return newError(CodespaceRoot, code, format, args...)
} }
func newError(codespace CodespaceType, code CodeType, msg string) *sdkError { func newError(codespace CodespaceType, code CodeType, format string, args ...interface{}) *sdkError {
if msg == "" { if format == "" {
msg = CodeToDefaultMsg(code) format = CodeToDefaultMsg(code)
} }
return &sdkError{ return &sdkError{
codespace: codespace, codespace: codespace,
code: code, code: code,
err: cmn.NewErrorWithT(code, msg), cmnError: cmn.NewError(format, args...),
} }
} }
type sdkError struct { type sdkError struct {
codespace CodespaceType codespace CodespaceType
code CodeType code CodeType
err cmn.Error cmnError
} }
// Implements ABCIError. // Implements ABCIError.
func (err *sdkError) TraceSDK(format string, args ...interface{}) Error {
err.Trace(1, format, args...)
return err
}
// Implements ABCIError.
// Overrides err.Error.Error().
func (err *sdkError) Error() string { func (err *sdkError) Error() string {
return fmt.Sprintf("Error{%d:%d,%#v}", err.codespace, err.code, err.err) return fmt.Sprintf("Error{%d:%d,%#v}", err.codespace, err.code, err.cmnError)
} }
// Implements ABCIError. // Implements ABCIError.
@ -209,33 +221,7 @@ Code: %v
ABCICode: %v ABCICode: %v
Error: %#v Error: %#v
=== /ABCI Log === === /ABCI Log ===
`, err.codespace, err.code, err.ABCICode(), err.err) `, err.codespace, err.code, err.ABCICode(), err.cmnError)
}
// Add tracing information with msg.
func (err *sdkError) Trace(msg string) Error {
return &sdkError{
codespace: err.codespace,
code: err.code,
err: err.err.Trace(msg),
}
}
// Implements Error.
func (err *sdkError) WithDefaultCodespace(cs CodespaceType) Error {
codespace := err.codespace
if codespace == CodespaceUndefined {
codespace = cs
}
return &sdkError{
codespace: codespace,
code: err.code,
err: err.err,
}
}
func (err *sdkError) T() interface{} {
return err.err.T()
} }
func (err *sdkError) Result() Result { func (err *sdkError) Result() Result {

View File

@ -27,28 +27,28 @@ func (msg MsgSend) ValidateBasic() sdk.Error {
// this just makes sure all the inputs and outputs are properly formatted, // this just makes sure all the inputs and outputs are properly formatted,
// not that they actually have the money inside // not that they actually have the money inside
if len(msg.Inputs) == 0 { if len(msg.Inputs) == 0 {
return ErrNoInputs(DefaultCodespace).Trace("") return ErrNoInputs(DefaultCodespace).TraceSDK("")
} }
if len(msg.Outputs) == 0 { if len(msg.Outputs) == 0 {
return ErrNoOutputs(DefaultCodespace).Trace("") return ErrNoOutputs(DefaultCodespace).TraceSDK("")
} }
// make sure all inputs and outputs are individually valid // make sure all inputs and outputs are individually valid
var totalIn, totalOut sdk.Coins var totalIn, totalOut sdk.Coins
for _, in := range msg.Inputs { for _, in := range msg.Inputs {
if err := in.ValidateBasic(); err != nil { if err := in.ValidateBasic(); err != nil {
return err.Trace("") return err.TraceSDK("")
} }
totalIn = totalIn.Plus(in.Coins) totalIn = totalIn.Plus(in.Coins)
} }
for _, out := range msg.Outputs { for _, out := range msg.Outputs {
if err := out.ValidateBasic(); err != nil { if err := out.ValidateBasic(); err != nil {
return err.Trace("") return err.TraceSDK("")
} }
totalOut = totalOut.Plus(out.Coins) totalOut = totalOut.Plus(out.Coins)
} }
// make sure inputs and outputs match // make sure inputs and outputs match
if !totalIn.IsEqual(totalOut) { if !totalIn.IsEqual(totalOut) {
return sdk.ErrInvalidCoins(totalIn.String()).Trace("inputs and outputs don't match") return sdk.ErrInvalidCoins(totalIn.String()).TraceSDK("inputs and outputs don't match")
} }
return nil return nil
} }
@ -107,11 +107,11 @@ func (msg MsgIssue) Type() string { return "bank" } // TODO: "bank/issue"
func (msg MsgIssue) ValidateBasic() sdk.Error { func (msg MsgIssue) ValidateBasic() sdk.Error {
// XXX // XXX
if len(msg.Outputs) == 0 { if len(msg.Outputs) == 0 {
return ErrNoOutputs(DefaultCodespace).Trace("") return ErrNoOutputs(DefaultCodespace).TraceSDK("")
} }
for _, out := range msg.Outputs { for _, out := range msg.Outputs {
if err := out.ValidateBasic(); err != nil { if err := out.ValidateBasic(); err != nil {
return err.Trace("") return err.TraceSDK("")
} }
} }
return nil return nil

View File

@ -65,7 +65,7 @@ func (p IBCPacket) GetSignBytes() []byte {
// validator the ibc packey // validator the ibc packey
func (p IBCPacket) ValidateBasic() sdk.Error { func (p IBCPacket) ValidateBasic() sdk.Error {
if p.SrcChain == p.DestChain { if p.SrcChain == p.DestChain {
return ErrIdenticalChains(DefaultCodespace).Trace("") return ErrIdenticalChains(DefaultCodespace).TraceSDK("")
} }
if !p.Coins.IsValid() { if !p.Coins.IsValid() {
return sdk.ErrInvalidCoins("") return sdk.ErrInvalidCoins("")