Documentation ¶
Overview ¶
Package errors implements custom error interfaces for cosmos-sdk.
Error declarations should be generic and cover broad range of cases. Each returned error instance can wrap a generic error declaration to provide more details.
This package provides a broad range of errors declared that fits all common cases. If an error is very specific for an extension it can be registered outside of the errors package. If it will be needed my many extensions, please consider registering it in the errors package. To create a new error instance use Register function. You must provide a unique, non zero error code and a short description, for example:
var ErrZeroDivision = errors.Register(9241, "zero division")
When returning an error, you can attach to it an additional context information by using Wrap function, for example:
func safeDiv(val, div int) (int, err) { if div == 0 { return 0, errors.Wrapf(ErrZeroDivision, "cannot divide %d", val) } return val / div, nil }
The first time an error instance is wrapped a stacktrace is attached as well. Stacktrace information can be printed using %+v and %v formats.
%s is just the error message %+v is the full stack trace %v appends a compressed [filename:line] where the error was created
Index ¶
- Constants
- Variables
- func ABCIError(codespace string, code uint32, log string) error
- func ABCIInfo(err error, debug bool) (codespace string, code uint32, log string)
- func AssertNil(err error)
- func IsOf(received error, targets ...error) bool
- func QueryResult(err error) abci.ResponseQuery
- func QueryResultWithDebug(err error, debug bool) abci.ResponseQuery
- func Recover(err *error)
- func Redact(err error) error
- func ResponseCheckTx(err error, gw, gu uint64, debug bool) abci.ResponseCheckTx
- func ResponseCheckTxWithEvents(err error, gw, gu uint64, events []abci.Event, debug bool) abci.ResponseCheckTx
- func ResponseDeliverTx(err error, gw, gu uint64, debug bool) abci.ResponseDeliverTx
- func ResponseDeliverTxWithEvents(err error, gw, gu uint64, events []abci.Event, debug bool) abci.ResponseDeliverTx
- func WithType(err error, obj interface{}) error
- func Wrap(err error, description string) error
- func Wrapf(err error, format string, args ...interface{}) error
- type Error
Examples ¶
Constants ¶
const RootCodespace = "sdk"
RootCodespace is the codespace for all errors defined in this package
const ( // SuccessABCICode declares an ABCI response use 0 to signal that the // processing was successful and no error is returned. SuccessABCICode = 0 )
const UndefinedCodespace = "undefined"
UndefinedCodespace when we explicitly declare no codespace
Variables ¶
var ( // ErrTxDecode is returned if we cannot parse a transaction ErrTxDecode = Register(RootCodespace, 2, "tx parse error") // ErrInvalidSequence is used the sequence number (nonce) is incorrect // for the signature ErrInvalidSequence = Register(RootCodespace, 3, "invalid sequence") // authorization is handled. ErrUnauthorized = Register(RootCodespace, 4, "unauthorized") // ErrInsufficientFunds is used when the account cannot pay requested amount. ErrInsufficientFunds = Register(RootCodespace, 5, "insufficient funds") // ErrUnknownRequest to doc ErrUnknownRequest = Register(RootCodespace, 6, "unknown request") // ErrInvalidAddress to doc ErrInvalidAddress = Register(RootCodespace, 7, "invalid address") // ErrInvalidPubKey to doc ErrInvalidPubKey = Register(RootCodespace, 8, "invalid pubkey") // ErrUnknownAddress to doc ErrUnknownAddress = Register(RootCodespace, 9, "unknown address") // ErrInvalidCoins to doc ErrInvalidCoins = Register(RootCodespace, 10, "invalid coins") // ErrOutOfGas to doc ErrOutOfGas = Register(RootCodespace, 11, "out of gas") // ErrMemoTooLarge to doc ErrMemoTooLarge = Register(RootCodespace, 12, "memo too large") // ErrInsufficientFee to doc ErrInsufficientFee = Register(RootCodespace, 13, "insufficient fee") // ErrTooManySignatures to doc ErrTooManySignatures = Register(RootCodespace, 14, "maximum number of signatures exceeded") // ErrNoSignatures to doc ErrNoSignatures = Register(RootCodespace, 15, "no signatures supplied") // ErrJSONMarshal defines an ABCI typed JSON marshalling error ErrJSONMarshal = Register(RootCodespace, 16, "failed to marshal JSON bytes") // ErrJSONUnmarshal defines an ABCI typed JSON unmarshalling error ErrJSONUnmarshal = Register(RootCodespace, 17, "failed to unmarshal JSON bytes") // ErrInvalidRequest defines an ABCI typed error where the request contains // invalid data. ErrInvalidRequest = Register(RootCodespace, 18, "invalid request") // ErrTxInMempoolCache defines an ABCI typed error where a tx already exists // in the mempool. ErrTxInMempoolCache = Register(RootCodespace, 19, "tx already in mempool") // ErrMempoolIsFull defines an ABCI typed error where the mempool is full. ErrMempoolIsFull = Register(RootCodespace, 20, "mempool is full") // ErrTxTooLarge defines an ABCI typed error where tx is too large. ErrTxTooLarge = Register(RootCodespace, 21, "tx too large") // ErrKeyNotFound defines an error when the key doesn't exist ErrKeyNotFound = Register(RootCodespace, 22, "key not found") // ErrWrongPassword defines an error when the key password is invalid. ErrWrongPassword = Register(RootCodespace, 23, "invalid account password") // ErrorInvalidSigner defines an error when the tx intended signer does not match the given signer. ErrorInvalidSigner = Register(RootCodespace, 24, "tx intended signer does not match the given signer") // ErrorInvalidGasAdjustment defines an error for an invalid gas adjustment ErrorInvalidGasAdjustment = Register(RootCodespace, 25, "invalid gas adjustment") // ErrInvalidHeight defines an error for an invalid height ErrInvalidHeight = Register(RootCodespace, 26, "invalid height") // ErrInvalidVersion defines a general error for an invalid version ErrInvalidVersion = Register(RootCodespace, 27, "invalid version") // ErrInvalidChainID defines an error when the chain-id is invalid. ErrInvalidChainID = Register(RootCodespace, 28, "invalid chain-id") // ErrInvalidType defines an error an invalid type. ErrInvalidType = Register(RootCodespace, 29, "invalid type") // ErrTxTimeoutHeight defines an error for when a tx is rejected out due to an // explicitly set timeout height. ErrTxTimeoutHeight = Register(RootCodespace, 30, "tx timeout height") // ErrUnknownExtensionOptions defines an error for unknown extension options. ErrUnknownExtensionOptions = Register(RootCodespace, 31, "unknown extension options") // ErrWrongSequence defines an error where the account sequence defined in // the signer info doesn't match the account's actual sequence number. ErrWrongSequence = Register(RootCodespace, 32, "incorrect account sequence") // ErrPackAny defines an error when packing a protobuf message to Any fails. ErrPackAny = Register(RootCodespace, 33, "failed packing protobuf message to Any") // ErrUnpackAny defines an error when unpacking a protobuf message from Any fails. ErrUnpackAny = Register(RootCodespace, 34, "failed unpacking protobuf message from Any") // ErrLogic defines an internal logic error, e.g. an invariant or assertion // that is violated. It is a programmer error, not a user-facing error. ErrLogic = Register(RootCodespace, 35, "internal logic error") // ErrConflict defines a conflict error, e.g. when two goroutines try to access // the same resource and one of them fails. ErrConflict = Register(RootCodespace, 36, "conflict") // ErrNotSupported is returned when we call a branch of a code which is currently not // supported. ErrNotSupported = Register(RootCodespace, 37, "feature not supported") // ErrNotFound defines an error when requested entity doesn't exist in the state. ErrNotFound = Register(RootCodespace, 38, "not found") // ErrIO should be used to wrap internal errors caused by external operation. // Examples: not DB domain error, file writing etc... ErrIO = Register(RootCodespace, 39, "Internal IO error") // ErrAppConfig defines an error occurred if min-gas-prices field in BaseConfig is empty. ErrAppConfig = Register(RootCodespace, 40, "error in app.toml") // ErrPanic is only set when we recover from a panic, so we know to // redact potentially sensitive system info ErrPanic = Register(UndefinedCodespace, 111222, "panic") // ErrExcessStandingMember defines an error occurred if standing member excess maximum quantity. ErrExcessStandingMember = Register(RootCodespace, 41, "standing validator excessed maximum quantity") )
Functions ¶
func ABCIError ¶
ABCIError will resolve an error code/log from an abci result into an error message. If the code is registered, it will map it back to the canonical error, so we can do eg. ErrNotFound.Is(err) on something we get back from an external API.
This should *only* be used in clients, not in the server side. The server (abci app / blockchain) should only refer to registered errors
func ABCIInfo ¶
ABCIInfo returns the ABCI error information as consumed by the tendermint client. Returned codespace, code, and log message should be used as a ABCI response. Any error that does not provide ABCICode information is categorized as error with code 1, codespace UndefinedCodespace When not running in a debug mode all messages of errors that do not provide ABCICode information are replaced with generic "internal error". Errors without an ABCICode information as considered internal.
func AssertNil ¶
func AssertNil(err error)
AssertNil panics on error Should be only used with interface methods, which require return error, but the error is always nil
func IsOf ¶
IsOf checks if a received error is caused by one of the target errors. It extends the errors.Is functionality to a list of errors.
func QueryResult ¶
func QueryResult(err error) abci.ResponseQuery
QueryResult returns a ResponseQuery from an error. It will try to parse ABCI info from the error.
func QueryResultWithDebug ¶
func QueryResultWithDebug(err error, debug bool) abci.ResponseQuery
QueryResultWithDebug returns a ResponseQuery from an error. It will try to parse ABCI info from the error. It will use debugErrEncoder if debug parameter is true. Starting from v0.46, this function will be removed, and be replaced by `QueryResult`.
func Recover ¶
func Recover(err *error)
Recover captures a panic and stop its propagation. If panic happens it is transformed into a ErrPanic instance and assigned to given error. Call this function using defer in order to work as expected.
func Redact ¶
Redact replaces an error that is not initialized as an ABCI Error with a generic internal error instance. If the error is an ABCI Error, that error is simply returned.
func ResponseCheckTx ¶
func ResponseCheckTx(err error, gw, gu uint64, debug bool) abci.ResponseCheckTx
ResponseCheckTx returns an ABCI ResponseCheckTx object with fields filled in from the given error and gas values.
func ResponseCheckTxWithEvents ¶ added in v0.45.1
func ResponseCheckTxWithEvents(err error, gw, gu uint64, events []abci.Event, debug bool) abci.ResponseCheckTx
ResponseCheckTxWithEvents returns an ABCI ResponseCheckTx object with fields filled in from the given error, gas values and events.
func ResponseDeliverTx ¶
func ResponseDeliverTx(err error, gw, gu uint64, debug bool) abci.ResponseDeliverTx
ResponseDeliverTx returns an ABCI ResponseDeliverTx object with fields filled in from the given error and gas values.
func ResponseDeliverTxWithEvents ¶ added in v0.45.1
func ResponseDeliverTxWithEvents(err error, gw, gu uint64, events []abci.Event, debug bool) abci.ResponseDeliverTx
ResponseDeliverTxWithEvents returns an ABCI ResponseDeliverTx object with fields filled in from the given error, gas values and events.
func Wrap ¶
Wrap extends given error with an additional information.
If the wrapped error does not provide ABCICode method (ie. stdlib errors), it will be labeled as internal error.
If err is nil, this returns nil, avoiding the need for an if statement when wrapping a error returned at the end of a function
Example ¶
err1 := Wrap(ErrInsufficientFunds, "90 is smaller than 100") err2 := errors.Wrap(ErrInsufficientFunds, "90 is smaller than 100") fmt.Println(err1.Error()) fmt.Println(err2.Error())
Output: 90 is smaller than 100: insufficient funds 90 is smaller than 100: insufficient funds
func Wrapf ¶
Wrapf extends given error with an additional information.
This function works like Wrap function with additional functionality of formatting the input as specified.
Example ¶
err1 := Wrap(ErrInsufficientFunds, "90 is smaller than 100") err2 := errors.Wrap(ErrInsufficientFunds, "90 is smaller than 100") fmt.Println(err1.Error()) fmt.Println(err2.Error())
Output: 90 is smaller than 100: insufficient funds 90 is smaller than 100: insufficient funds
Types ¶
type Error ¶
type Error struct {
// contains filtered or unexported fields
}
Error represents a root error.
Weave framework is using root error to categorize issues. Each instance created during the runtime should wrap one of the declared root errors. This allows error tests and returning all errors to the client in a safe manner.
All popular root errors are declared in this package. If an extension has to declare a custom root error, always use Register function to ensure error code uniqueness.
func Register ¶
Register returns an error instance that should be used as the base for creating error instances during runtime.
Popular root errors are declared in this package, but extensions may want to declare custom codes. This function ensures that no error code is used twice. Attempt to reuse an error code results in panic.
Use this function only during a program startup phase.
func (*Error) Is ¶
Is check if given error instance is of a given kind/type. This involves unwrapping given error using the Cause method if available.