This document outlines the recommended usage and APIs for error handling in Cosmos SDK modules.
Modules are encouraged to define and register their own errors to provide better
context on failed message or handler execution. Typically, these errors should be
common or general errors which can be further wrapped to provide additional specific
execution context.
Modules should define and register their custom errors in x/{module}/errors.go. Registration
of errors is handled via the types/errors package.
Example:
Copy
package types
import(
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors")// x/distribution module sentinel errorsvar(
ErrEmptyDelegatorAddr = sdkerrors.Register(ModuleName,1,"delegator address is empty")
ErrEmptyWithdrawAddr = sdkerrors.Register(ModuleName,2,"withdraw address is empty")
ErrEmptyValidatorAddr = sdkerrors.Register(ModuleName,3,"validator address is empty")
ErrEmptyDelegationDistInfo = sdkerrors.Register(ModuleName,4,"no delegation distribution info")
ErrNoValidatorDistInfo = sdkerrors.Register(ModuleName,5,"no validator distribution info")
ErrNoValidatorCommission = sdkerrors.Register(ModuleName,6,"no validator commission to withdraw")
ErrSetWithdrawAddrDisabled = sdkerrors.Register(ModuleName,7,"set withdraw address disabled")
ErrBadDistribution = sdkerrors.Register(ModuleName,8,"community pool does not have sufficient coins to distribute")
ErrInvalidProposalAmount = sdkerrors.Register(ModuleName,9,"invalid community pool spend proposal amount")
ErrEmptyProposalRecipient = sdkerrors.Register(ModuleName,10,"invalid community pool spend proposal recipient")
ErrNoValidatorExists = sdkerrors.Register(ModuleName,11,"validator does not exist")
ErrNoDelegationExists = sdkerrors.Register(ModuleName,12,"delegation does not exist"))
Each custom module error must provide the codespace, which is typically the module name
(e.g. "distribution") and is unique per module, and a uint32 code. Together, the codespace and code
provide a globally unique SDK error. Typically, the code is monotonically increasing but does not
necessarily have to be. The only restrictions on error codes are the following:
Must be greater than one, as a code value of one is reserved for internal errors.
Must be unique within the module.
Note, the SDK provides a core set of common errors. These errors are defined in types/errors/errors.go.
The custom module errors can be returned as their concrete type as they already fulfill the error
interface. However, module errors can be wrapped to provide further context and meaning to failed
execution.
If a module error is registered, the SDK errors package allows ABCI information to be extracted
through the ABCIInfo API. The package also provides ResponseCheckTx and ResponseDeliverTx as
auxiliary APIs to automatically get CheckTx and DeliverTx responses from an error.