Saltar al contenido principal

Organizar errores de contrato con un tipo de enumeración de errores

Una manera conveniente de gestionar y comunicar de manera significativa los errores de contrato es recopilarlos en una estructura de enum. Estos errores son un tipo especial de tipo entero de enumeración que se almacenan en el ledger como valores de Estado que contienen un código u32. Primero, crea la estructura Error en tu contrato inteligente.

#[contracterror]
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
#[repr(u32)]
pub enum Error {
FirstError = 1,
AnotherError = 2,
YetAnotherError = 3,
GenericError = 4
}

Luego, causa un pánico con un error cuando se cumplan las condiciones. Este ejemplo causará un pánico con el error especificado.

#[contractimpl]
impl Contract {
pub fn causeerror(env: Env, error_code: u32) -> Result<(), Error> {
match error_code {
1 => Err(Error::FirstError),
2 => Err(Error::AnotherError),
3 => Err(Error::YetAnotherError),
_ => Err(Error::GenericError),
}
}
}

Cuando se convierte a XDR, el valor se convierte en un ScVal, que contiene un ScStatus, que contiene el valor entero del error como error de contrato.

{ "status": { "contractError": 1 } }