macro_rules! decl_error {
    (
		$(#[$attr:meta])*
		pub enum $error:ident
			for $module:ident<
				$generic:ident: $trait:path
				$(, $inst_generic:ident: $instance:path)?
			>
			$( where $( $where_ty:ty: $where_bound:path ),* $(,)? )?
		{
			$(
				$( #[doc = $doc_attr:tt] )*
				$name:ident
			),*
			$(,)?
		}
	) => { ... };
    (@GENERATE_AS_U8
		$self:ident
		$error:ident
		{ $( $generated:tt )* }
		$index:expr,
		$name:ident
		$( , $rest:ident )*
	) => { ... };
    (@GENERATE_AS_U8
		$self:ident
		$error:ident
		{ $( $generated:tt )* }
		$index:expr,
	) => { ... };
}
Expand description

Declare an error type for a runtime module.

decl_error! supports only variants that do not hold any data. The dispatchable functions return DispatchResult. The error type implements From<ErrorType> for DispatchResult to make the error type usable as error in the dispatchable functions.

It is required that the error type is registered in decl_module! to make the error exported in the metadata.

Usage

decl_error! {
    /// Errors that can occur in my module.
    pub enum MyError for Module<T: Config> {
        /// Hey this is an error message that indicates bla.
        MyCoolErrorMessage,
        /// You are just not cool enough for my module!
        YouAreNotCoolEnough,
    }
}


// You need to register the error type in `decl_module!` as well to make the error
// exported in the metadata.

decl_module! {
    pub struct Module<T: Config> for enum Call where origin: T::Origin {
        type Error = MyError<T>;

        #[weight = 0]
        fn do_something(origin) -> frame_support::dispatch::DispatchResult {
            Err(MyError::<T>::YouAreNotCoolEnough.into())
        }
    }
}

For instantiable modules you also need to give the instance generic type and bound to the error declaration.