You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Anchor框架自定义ErrorCode枚举遇属性及变体查找错误求助

解决Anchor中自定义错误枚举的问题

错误原因分析

你遇到的三个错误可以归纳为两类问题:

  1. 错误宏使用错误:Anchor框架不支持用#[error]定义自定义错误,且#[msg]属性需要配合正确的错误宏使用
  2. 命名冲突:自定义的ErrorCode与anchor_lang内置的同名枚举冲突,导致编译器找不到你定义的变体

修正方案

1. 替换错误宏并修复属性

Anchor中自定义错误必须使用#[error_code]宏,该宏会自动为枚举实现AnchorError trait,并支持用#[msg]为每个变体定义错误提示信息。

2. 解决命名冲突

由于anchor_lang::prelude已经导出了ErrorCode枚举,你需要要么重命名自己的枚举,要么用模块隔离自定义枚举。


修正后的代码示例

方案一:重命名自定义枚举

use anchor_lang::prelude::*;

// 重命名为CustomErrorCode,避免与内置枚举冲突
#[error_code]
pub enum CustomErrorCode {
    #[msg("You are not authorized to complete this transaction")]
    Unauthorized,
}

// 使用示例
fn example(a: u8, b: u8) -> Result<()> {
    if a != b {
        return Err(CustomErrorCode::Unauthorized.into());
    }
    Ok(())
}

方案二:用模块隔离自定义枚举

如果不想改名,可以将自定义枚举放在单独的模块中:

use anchor_lang::prelude::*;

mod custom_errors {
    use anchor_lang::prelude::*;

    #[error_code]
    pub enum ErrorCode {
        #[msg("You are not authorized to complete this transaction")]
        Unauthorized,
    }
}

// 使用示例
fn example(a: u8, b: u8) -> Result<()> {
    if a != b {
        return Err(custom_errors::ErrorCode::Unauthorized.into());
    }
    Ok(())
}

额外注意点

  • 确保调用into()时是小写字母开头,你的错误信息中出现了.Into()(大写I),这会导致编译错误,需修正为.into()。
  • #[error_code]宏会自动处理错误码的生成,每个变体对应一个唯一的错误码,无需手动指定。

内容的提问来源于stack exchange,提问作者Satyaban Sahoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 06:18:29