Sui.

Publication

Partagez vos connaissances.

HaGiang.
Jun 15, 2025
Questions et Réponses avec des Experts

à quoi servent les erreurs avec l'attribut # [error] ?

Ce sont toujours des nombres dans une chaîne à la fois dans les modules wallets/explorers/move.

  • Sui
2
2
Partager
Commentaires
.

Réponses

2
0xduckmove.
Jun 15 2025, 09:24

L'attribut # [error] de Move (en particulier dans Move 2024) vous permet de définir les constantes d'erreur sous forme de messages lisibles par l'homme (sous forme de vecteurs), et pas simplement sous forme de nombres. Il s'agit d'une nouvelle fonctionnalité qui améliore l'expérience des développeurs et des utilisateurs.

#[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);
}

Pour plus de détails, consultez le Move Book : https://move-book.com/move-basics/assert-and-abort.html#error-messages

2
Meilleure réponse
Commentaires
.
harry phan.
Jun 30 2025, 07:55

L'attribut # [error] de Move (en particulier dans Move 2024) vous permet de définir les constantes d'erreur sous forme de messages lisibles par l'homme (sous forme de vecteurs), et pas simplement sous forme de nombres. Il s'agit d'une nouvelle fonctionnalité qui améliore l'expérience des développeurs et des utilisateurs.

Pourquoi utiliser # [error] ?

-**Messages d'erreur descriptifs :**Au lieu de simplement renvoyer un chiffre (comme abort 1), vous pouvez renvoyer un message de chaîne expliquant le problème. -**Meilleur débogage :**Les développeurs et les utilisateurs peuvent identifier la raison claire de l'échec, ce qui facilite la compréhension et la résolution des problèmes. -**Expérience utilisateur améliorée :**Les portefeuilles, les explorateurs et les DApps peuvent afficher des messages d'erreur significatifs aux utilisateurs, et pas seulement des codes d'erreur.

Exemples

#[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);
}

Lorsque l'assertion échoue, le message d'erreur « L'utilisateur n'est pas autorisé à effectuer cette action » peut être affiché, au lieu d'un simple chiffre.

Les erreurs sont-elles toujours numérotées dans les portefeuilles et les explorateurs ?

-**Ancien style :**Les erreurs n'étaient que des chiffres (par exemple, abandonner 1), et les portefeuilles et les explorateurs n'affichaient que le code. -**Avec # [error] :**Si le portefeuille/l'explorateur prend en charge les messages d'erreur Move 2024, il peut décoder et afficher la chaîne. Sinon, il peut toujours afficher les octets bruts ou un nombre.

L'attribut # [error] vise donc à rendre la gestion des erreurs plus expressive et plus conviviale, mais la prise en charge complète dépend des outils (portefeuilles, explorateurs) mis à jour pour afficher ces messages.

Pour plus de détails, consultez le Move Book : Messages d'erreur.

Aimeriez-vous savoir comment définir les erreurs numériques et les erreurs de chaîne dans un module Move ? Ou souhaitez-vous savoir comment faire en sorte que votre DApp ou votre portefeuille affiche ces messages ?

Comment décoder les messages # [d'erreur]

Lorsqu'une erreur apparaît dans un portefeuille, un explorateur ou un journal, elle peut ressembler à un nombre ou à une chaîne d'octets (par exemple, 0x5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e).

1.Si vous voyez un chiffre (par exemple,1) :

  • Il s'agit d'un ancien code d'erreur. Vous devez rechercher le code dans la source du module pour voir ce que cela signifie.

2. 0x546865...Si vous voyez une chaîne hexadécimale (par exemple,) :

  • Il s'agit d'un message d'erreur codé en UTF-8 sous forme de vecteur d'octets.

#####Pour décoder :

  • Supprimez le 0xpréfixe.
  • Convertissez la chaîne hexadécimale en octets.
  • Interprétez les octets comme une chaîne UTF-8.

####Exemple

Supposons que l'erreur suivante s'affiche : 0x5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e

  • Supprimer0x.
  • Convertissez l'hexadécimal en 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
  • Cela se décode pour :
  • L'utilisateur n'est pas autorisé à effectuer cette action

####Comment décoder en code (Rust, JS, Python, etc.) :

-Rouille :

let hex = « 5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e » ; let bytes = hex : :decode (hex) .unwrap () ; let message = String : :from_utf8 (octets) .unwrap () ; Println ! (« {} », message) ; -Javascript :

const hex = « 5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e » ; const message = Buffer.from (hex, « hex ») .toString (« utf8 ») ; console.log (message) ; -Python :**

hex_str = « 5468652075736572206973206e6f7420617574686f72697a656420746f20706572666f726d207468697320616374696f6e » message = octets.fromhex (hex_str) .decode (« utf-8 ») imprimer (message)

Résumé :

  • Si vous voyez un chiffre, recherchez-le dans le code.
  • Si vous voyez une chaîne hexadécimale, décodez-la en UTF-8 pour obtenir l'erreur lisible par l'homme.

Si vous voulez un outil en ligne rapide, recherchez simplement « convertisseur hexadécimal en texte » et collez votre chaîne hexadécimale.

Souhaitez-vous un script ou un outil pour décoder automatiquement ces erreurs ? Ou souhaitez-vous savoir comment rendre vos propres erreurs plus lisibles dans votre code Move ?

1
Commentaires
.

Connaissez-vous la réponse ?

Veuillez vous connecter et la partager.

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

610Publications1335Réponses
Sui.X.Peera.

Gagne ta part de 1000 Sui

Gagne des points de réputation et obtiens des récompenses pour avoir aidé la communauté Sui à se développer.

Campagne de RécompensesJuillet