Tratamento de Erros On-Chain
Programas comunicam falha por ProgramResult (Result<(), ProgramError>) ou enums de erro customizados mapeados para códigos. Clientes decodificam esses códigos off-chain para UX e depuração.
Busque em todas as páginas da documentação
Programas comunicam falha por ProgramResult (Result<(), ProgramError>) ou enums de erro customizados mapeados para códigos. Clientes decodificam esses códigos off-chain para UX e depuração.
use solana_program::program_error::ProgramError;
fn require_init(data_len: usize, need: usize) -> Result<(), ProgramError> {
if data_len < need {
return Err(ProgramError::InvalidAccountData);
}
Ok(())
}Quando usar:
?.use solana_program::program_error::ProgramError;
#[repr(u32)]
pub enum VaultError {
InsufficientFunds = 6000,
Unauthorized = 6001,
}
impl From<VaultError> for ProgramError {
fn from(e: VaultError) -> Self {
ProgramError::Custom(e as u32)
}
}
pub fn withdraw(amount: u64, balance: u64) -> Result<(), ProgramError> {
if amount > balance {
return Err(VaultError::InsufficientFunds.into());
}
Ok(())
}O que isso demonstra:
ProgramError::Custom(code).From habilita ? nos handlers de instrução.| Camada | Tipo |
|---|---|
| Runtime | ProgramError::InvalidAccountData |
| App | ProgramError::Custom(u32) |
| Anchor | macro atributo error_code |
type VaultResult<T> = Result<T, ProgramError>;Err com variante explícita.invoke. Correção: Use ? ou mapeie para seu enum.| Alternativa | Use quando | Não use quando |
|---|---|---|
macro Anchor error! | Export IDL automático | Builds não-Anchor |
| Só builtins ProgramError | Códigos mínimos | UX de produto |
| Events para caminhos de sucesso | Observabilidade rica | Não substitui erros |
Alias para Result<(), ProgramError>.
Não - instrução com falha reverte todas as mudanças.
Anchor adiciona offset 6000+ para códigos customizados em 0.32.x.
Funciona se nenhuma feature só-std estiver habilitada.
Permitido mas custa CUs - mantenha curto.
Combine código customizado com enum off-chain.
Builtins são portáteis; custom precisa IDL do programa.
Sim - propague com ? no handler de instrução.
Evite - use retornos explícitos.
Primeira instrução com falha falha a tx inteira (a menos que tratada).
Mesmos códigos da execução on-chain.
Propague ou mapeie deliberadamente - não engula.
Versões da stack: Esta página foi 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 e LiteSVM 0.6.x.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026