Sui.

帖子

分享您的知识。

HaGiang.
Jun 15, 2025
专家问答

# [错误] 属性的错误意义何在?

在钱包/资源管理器/移动模块中,它们仍然是字符串中的数字.

  • Sui
2
2
分享
评论
.

答案

2
0xduckmove.
Jun 15 2025, 09:24

Move(尤其是在 Move 2024 中)中的 # [错误] 属性允许您将错误常量定义为人类可读的消息(矢量),而不仅仅是数字. 这是一项改善开发者和用户体验的新功能.

#[error]
const ENotAuthorized: vector<u8> = b"The user is not authorized to perform this action";

public fun update_value(user: &mut User, value: u64) {
    assert!(user.is_authorized, ENotAuthorized);
}

欲了解更多详情,请参阅 Move Book:https://move-book.com/move-basics/assert-and-abort.html#error-messages

2
最佳答案
评论
.
harry phan.
Jun 30 2025, 07:55

Move(尤其是在 Move 2024 中)中的 # [错误] 属性允许您将错误常量定义为人类可读的消息(矢量),而不仅仅是数字. 这是一项改善开发者和用户体验的新功能.

为什么使用 # [错误]?

-**描述性错误消息:**您不仅可以返回数字(如 abort 1),还可以返回一个字符串消息来解释出了什么问题. -**更好的调试:**开发人员和用户可以看到失败的明确原因,从而更容易理解和修复问题. -**改进的用户体验:**钱包、资源管理器和 dApp 可以向用户显示有意义的错误消息,而不仅仅是错误代码.

示例

#[error]
const ENotAuthorized: vector<u8> = b"The user is not authorized to perform this action";

public fun update_value(user: &mut User, value: u64) {
    assert!(user.is_authorized, ENotAuthorized);
}

当断言失败时,可以显示错误消息 “用户无权执行此操作”,而不仅仅是数字.

钱包/资源管理器中的错误仍然是数字吗?

-**旧风格:**错误只是数字(例如,中止 1),钱包/资源管理器只会显示代码. -带有 # [错误]: 如果钱包/资源管理器支持 Move 2024 错误消息,它可以解码并显示字符串. 否则,它仍可能显示原始字节或数字.

因此,# [error] 属性旨在使错误处理更具表现力和用户友好,但是全面支持取决于更新以显示这些消息的工具(钱包、浏览器).

有关更多详细信息,请参阅 Move Book:错误消息.

你想看看如何在 Move 模块中定义数字和字符串错误吗?或者你对如何让你的dApp或钱包显示这些消息感兴趣?

如何解码 # [错误] 消息

当你在钱包、资源管理器或日志中看到错误时,它可能看起来像一个数字或字节串(例如,0x546865207573657265722067220673e6f7417576f7417574686f76576f7266732061757686f6f67696f673f676f673f676f673f676f673f676f673f673f67696f6e696f6e).

1. 如果你看到一个数字(例如,1):

-这是旧版错误代码. 你需要在模块的源代码中查找代码以了解其含义.

2. 如果你看到一个十六进制字符串(例如,0x546865...):

-这是一条 UTF-8 编码的错误消息,以字节矢量表示.

####解码: -删除前0x缀. -将十六进制字符串转换为字节. -将字节解释为 UTF-8 字符串.

###示例

假设你看到这个错误: 0x5468652075736572206973206e6e6f7420617574686f76f72697a656420746f2070657266f20706572666f726d20726d2072467320616374696f6f6e -移除0x. -将十六进制转换为 ASCII/UTF-8: -54 68 65 20 75 73 65 72 20 69 73 20 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 63 74 69 6f 6e -这解码为: -用户无权执行此操作

####如何在代码中解码(Rust、JS、Python 等):

-生锈:

let hex = “5468652075736572206973206e6e6f7420617574686f72697a65642074686f7267a656420746f20706572666f7266f726d20724673206206f6f6e”; let bytes = 十六进制:: decode (十六进制) .unwrap (); let message = 字符串:: from_utf8 (字节) .unwrap (); println!(“{}”,消息); -JavaScript:

const 十六进制 = “5468652075736572206973206e6e6f7420617574686f76f72697a656420746f20746f20706572666f7266f7266f7266f7266f7266f7266f7266f7266f7266f7266f72666f7266f7266f72666f7266f7266f6 const message = buffer.from(十六进制,“十六进制”).toString(“utf8”); console.log(消息); -Python:

hex_str = “5468652075736572206973206e6e6f7420617574686f742697a65642074686f7267a656420746f20706572666f7266f7266f7266f726d207673206206f6f6e” 消息 = bytes.fromhex (hex_str) .decode (“utf-8”) 打印(消息)

摘要: -如果你看到一个数字,在代码中查一下. -如果你看到十六进制字符串,请将其解码为 UTF-8 以获得人类可读的错误.

如果你想要一个快速的在线工具,只需搜索 “十六进制到文本转换器” 并粘贴你的十六进制字符串即可.

你想要一个脚本或工具来自动解码这些错误吗?或者你想知道如何让自己的错误在 Move 代码中更具可读性?

1
评论
.

你知道答案吗?

请登录并分享。

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

610帖子1335答案
Sui.X.Peera.

赚取你的 1000 Sui 份额

获取声誉积分,并因帮助 Sui 社区成长而获得奖励。

奖励活动七月