Допис
Діліться своїми знаннями.
який сенс помилок з атрибутом # [error]?
Вони все ще є числами в рядку як у гаманціх/дослідних/модулях переміщення.
- Sui
Відповіді
2Атрибут # [error] у 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);
}
Докладніші відомості див. у розділі Переміщення книги: https://move-book.com/move-basics/assert-and-abort.html#error-messages
Атрибут # [error] у Move (особливо в Move 2024) дозволяє визначати константи помилок як повідомлення, що читаються людиною (як вектор
Навіщо використовувати # [помилка]?
-Описові повідомлення про помилки: Замість того, щоб просто повернути число (наприклад, abort 1), ви можете повернути рядкове повідомлення, яке пояснює, що пішло не так. -Краще налагодження: Розробники та користувачі можуть побачити чітку причину збою, що полегшує розуміння та виправлення проблем. -Покращений UX: Гаманці, дослідники та DApps можуть відображати значущі повідомлення про помилки користувачам, а не лише коди помилок.
Приклади
#[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] полягає в тому, щоб зробити обробку помилок більш виразною та зручною для користувачів, але повна підтримка залежить від оновлень інструментів (гаманців, дослідників) для відображення цих повідомлень.
Докладніші відомості див. у розділі Переміщення книги: повідомлення про помилки.
Бажаєте побачити, як визначити як числові, так і рядкові помилки в модулі «Переміщення»? Або вас цікавить, як змусити ваш DApp або гаманець відображати ці повідомлення?
Як розшифрувати # [помилка] Повідомлення
Коли ви бачите помилку в гаманці, провіднику або журналі, вона може виглядати як число або рядок байтів (наприклад, 0x5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726f726f726d207468697320616374696f6e).
1.Якщо ви бачите число (наприклад,1
) :
- Це застарілий код помилки. Вам потрібно шукати код у джерелі модуля, щоб побачити, що він означає.
2.Якщо ви бачите шістнадцятковий рядок (наприклад,0x546865...
) :
- Це повідомлення про помилку, кодоване UTF-8 як вектор байтів.
#####Для декодування:
- Видаліть
0x
приставку. - Перетворення шістнадцяткового рядка в байти.
- Інтерпретувати байти як рядок UTF-8.
####Приклад
Припустимо, ви бачите цю помилку: 0x5468652075736572206973206e6ф7420617574686ф72697а656420746ф20706572666ф726д207468697320616374696ф6е
- Видалі
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 тощо) :
-Іржа:
нехай шестигранник = «5468652075736572206973206e6ф7420617574686ф72697а656420746ф20706572666ф726д207468697320616374696ф6е»; нехай байт = hex: :decode (hex) .unwrap (); нехай повідомлення = Рядок: :from_utf8 (байт) .unwrap (); друк! («{}», повідомлення); -JavaScript:
конст шестигранний = «5468652075736572206973206е6ф7420617574686ф72697а656420746ф20746ф20706572666ф726д207468697320616374696ф6е»; повідомлення const = буфер.від (шестигранник, «шестигранник») .toString («utf8"); console.log (повідомлення); -Пітон:
шестигранний_стор = «5468652075736572206973206е6ф7420617574686ф72697а656420746ф20706572666ф726д20746869732061637469696ф6е» повідомлення = байти.відшестигранник (hex_str) .декодування («utf-8") друк (повідомлення)
Резюме:
- Якщо ви бачите число, знайдіть його в коді.
- Якщо ви бачите шістнадцятковий рядок, розшифруйте його як UTF-8, щоб отримати помилку, що читається людиною.
Якщо вам потрібен швидкий онлайн-інструмент, просто знайдіть «шестигранний конвертер у текст» та вставте шестигранний рядок.
Хочете скрипт або інструмент для автоматичного декодування цих помилок? Або ви хочете знати, як зробити власні помилки більш читабельними у вашому коді Move?
Ви знаєте відповідь?
Будь ласка, увійдіть та поділіться нею.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Зароби свою частку з 1000 Sui
Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.

- ... SUIBigSneh+1396
- ... SUISuiLover+1333
- ... SUI0xduckmove+1207
- ... SUIThorfin+1202
- ... SUIOwen+970
- ... SUIharry phan+847
- ... SUItheking+742
- Чому BCS вимагає точного порядку полів для десеріалізації, коли структури Move мають названі поля?53
- Помилки перевірки кількох джерел» у публікаціях модуля Sui Move - автоматичне вирішення помилок43
- Невдала операція Sui: об'єкти, зарезервовані для іншої транзакції25
- Як обмеження здібностей взаємодіють з динамічними полями в гетерогенних колекціях?05