#[error_code] y require!
Los enums #[error_code] se mapean a códigos de error estables en el IDL. require! y similares asertan condiciones con esos errores.
Busca en todas las páginas de la documentación
Los enums #[error_code] se mapean a códigos de error estables en el IDL. require! y similares asertan condiciones con esos errores.
#[error_code]
pub enum MyError {
#[msg("El monto debe ser positivo")]
InvalidAmount,
}
require!(amount > 0, MyError::InvalidAmount);
require_eq!(owner, ctx.accounts.authority.key(), MyError::Unauthorized);Cuándo usar esto: Necesitas fallos tipados y decodificables por el cliente.
#[error_code]
pub enum VaultError {
#[msg("La bóveda está pausada")]
Paused,
#[msg("Saldo insuficiente")]
InsufficientFunds,
#[msg("Desbordamiento matemático")]
Overflow,
}
pub fn withdraw(ctx: Context<Withdraw>, amount: u64) -> Result<()> {
require!(!ctx.accounts.vault.paused, VaultError::Paused);
require!(ctx.accounts.vault.balance >= amount, VaultError::InsufficientFunds);
ctx.accounts.vault.balance = ctx.accounts.vault.balance
.checked_sub(amount)
.ok_or(VaultError::Overflow)?;
Ok(())
}Lo que esto demuestra:
#[msg] establece texto legible por humanosrequire_eq! compara valoresResult? para mapear errores de CPI| Macro | Uso |
|---|---|
require! | Condición booleana |
require_eq! / require_ne! | Comprobaciones de igualdad |
require_keys_eq! | Comparaciones de Pubkey |
Anchor asigna códigos de error a partir de un desplazamiento personalizado; los clientes decodifican a través del IDL.
#[error_code].require en bucles ajustados - El costo de CU se acumula. Solución: Valida una vez antes del bucle.msg - Fuga de información de seguridad. Solución: Mantén los mensajes seguros para el usuario.? en CPI - El error se traga. Solución: Propaga con ? o map_err.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| constraint @ Error | Tiempo de validación de cuenta | Reglas de negocio del manejador |
| Errores personalizados nativos | No-Anchor | Clientes integrados con IDL |
Códigos personalizados en IDL más cadenas #[msg].
emit_cpi! cuesta más CU pero mejora la fiabilidad de la captura.
Evítalo excepto detrás de flags de características.
Desde el IDL a través de Anchor o la generación de código de Codama.
Sí, los tipos #[event] se listan.
Sí, con @ MyError::Variant.
Cada línea de registro y cadena formateada.
anchor test esperando códigos de error.
Sí, pero no un contrato de API; usa eventos.
Ver Relacionados para errores.
Versiones de Stack: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, y LiteSVM 0.6.x.
Revisado por Chris St. John·Última actualización: 16 jul 2026