Fonctions Error, IfError, IsError et IsBlankOrError

S’applique à : Applications canevas Dataverse  Colonnes de formules  Flux Bureau  Applications pilotées par modèle Power Pages Power Platform  CLI

Détecte les erreurs et fournit une valeur alternative, ou prend des mesures. Créez une erreur personnalisée ou transmettez une erreur.

Note

Si une application a désactivé la fonctionnalité Gestion des erreurs au niveau de la formule sous Paramètres>Mises à jour>Retiré, ces fonctions ne fonctionneront pas correctement.

IfError

La fonction IfError teste les valeurs jusqu’à ce qu’elle trouve une erreur. Si la fonction découvre une erreur, la fonction évalue et renvoie une valeur de remplacement correspondante et arrête l’évaluation ultérieure. Une valeur par défaut peut également être fournie pour lorsqu’aucune erreur n’est trouvée. La structure de IfError ressemble à celui de la fonction If : IfError teste les erreurs, tandis que If teste true.

Utilisez IfError pour remplacer une erreur par une valeur valide afin que les calculs en aval puissent continuer. Par exemple, utilisez cette fonction si l’entrée utilisateur peut entraîner une division par zéro :

IfError( 1/x, 0 )

Cette formule renvoie 0 si la valeur de x est zéro, car 1/x produit une erreur. Si x n’est pas nul, alors 1/x est retourné.

Arrêt du traitement ultérieur

Quand vous effectuez le chaînage de formules dans des formules de comportement, telles que :

Patch( DS1, ... );
Patch( DS2, ... )

La deuxième fonction Patch de DS2 sera tentée même si le Patch de DS1 échoue. La portée d’une erreur est limitée à chaque formule chaînée.

Utilisez IfError pour effectuer une action et poursuivre le traitement uniquement si l’action a réussi. Appliquer IfError à cet exemple :

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" ),
    Patch( DS2, ... ), Notify( "problem in the second action" )
)

Si la fonction Patch de DS1 a un problème, le premier Notifier est exécuté. Aucun autre traitement n’a lieu, y compris le second Patch de DS2. Si le premier Patch réussit, le second Patch s’exécute.

S’il est fourni, l’argument DefaultResult facultatif est renvoyé si aucune erreur n’est découverte. Sans cet argument, le dernier argument Valeur est renvoyé.

Sur la base du dernier exemple, la valeur de retour de IfError peut être vérifié pour déterminer s’il y a eu des problèmes :

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" );  false,
    Patch( DS2, ... ), Notify( "problem in the second action" ); false,
    true
)

Compatibilité des types

IfError renvoie la valeur de l’un de ses arguments. Les types de toutes les valeurs qui peuvent être retournées par IfError doivent être compatibles.

Dans le dernier exemple, Patch renvoie un enregistrement qui n’est pas compatible avec les booléens utilisés pour les formules Replacement ou le DefaultResult. Ce qui est bien, car il n’y a pas de situation dans laquelle la valeur de retour de ces appels Patch seraient retournés par IfError.

Note

Alors que le comportement en cours de modification, les types de tous les arguments IfError doit être compatible actuellement.

Dans l’exemple simple décrit précédemment :

IfError( 1/x, 0 )

Les types de 1/x et 0 étaient compatibles car les deux étaient des nombres. Si ce n’est pas le cas, le deuxième argument est contraint de correspondre au type du premier argument.

Excel affiche #DIV/0! lorsqu’une division par zéro se produit.

Considérer IfError à la place :

IfError( 1/x, "#DIV/0!" )

La formule ci-dessus ne fonctionnera pas. La chaîne de texte "#DIV/0!" est contrainte au type du premier argument de IfError, qui est un nombre. Le résultat de IfError est une autre erreur puisque la chaîne de texte ne peut pas être contrainte. Pour résoudre ce problème, convertissez le premier argument en une chaîne de texte afin que IfError renvoie toujours une chaîne de texte :

IfError( Text( 1/x ), "#DIV/0!" )

Comme vu ci-dessus, IfError peut renvoyer une erreur si le Replacement ou DefaultResult est une erreur.

FirstError / AllErrors

Dans les formules de remplacement, des informations sur les erreurs trouvées sont disponibles via l’enregistrement FirstError et la table AllErrors. AllErrors est une table d’enregistrements d’informations d’erreur avec FirstError étant un raccourci vers le premier enregistrement de cette table. FirstError renvoie toujours la même valeur que First( AllErrors ).

Les enregistrements d’erreur incluent :

Champ Type Description
Gentil Énumération ErrorKind (nombre) Catégorie de l’erreur.
Message Chaîne de texte Message sur l’erreur, pouvant être affiché à l’utilisateur final.
Source Chaîne de texte Emplacement d’origine de l’erreur, utilisé pour les rapports. Par exemple, pour une formule liée à une propriété de contrôle, cette valeur est sous la forme ControlName.PropertyName.
Observé Chaîne de texte Emplacement où l’erreur est signalée à l’utilisateur, utilisé pour les rapports. Par exemple, pour une formule liée à une propriété de contrôle, cette valeur est sous la forme ControlName.PropertyName.
Détails Enregistrer Détails de l’erreur. Actuellement, les détails ne sont fournis que pour les erreurs réseau. Cet enregistrement comprend HttpStatusCode qui contient le code d’état HTTP et HttpResponse qui contient le corps de la réponse du connecteur ou du service.

Par exemple, prenons la formule suivante comme propriété OnSelect d’un contrôle Button :

Set( a, 1/0 )

Et cette formule sur la propriété OnSelect d’un second contrôle Button :

IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )

L’exemple de formule ci-dessus afficherait la bannière suivante lorsque les deux boutons sont activés en séquence :

Contrôle Button activé, affichant une notification de la fonction Notify.

En règle générale, il n’y aura qu’une seule erreur avec laquelle FirstError peut fonctionner correctement. Cependant, il existe des scénarios dans lesquels plusieurs erreurs peuvent être renvoyées. Par exemple, lors de l’utilisation d’un opérateur de chaînage de formules ou la fonction Concurrent. Même dans ces situations, signaler FirstError peut suffire à révéler un problème au lieu de surcharger un utilisateur avec plusieurs erreurs. Si vous devez toujours utiliser chaque erreur individuellement, vous pouvez utiliser la table AllErrors.

IsError

La fonction IsError teste une valeur d’erreur.

La valeur renvoyée est une valeur booléenne true ou false.

L’utilisation de IsError empêche tout traitement ultérieur de l’erreur.

IsBlankOrError

La fonction IsBlankOrError teste une valeur vide ou une valeur d’erreur et est l’équivalent de Or( IsBlank( X ), IsError( X ) ).

Lorsque vous activez la gestion des erreurs pour les applications existantes, pensez à remplacer IsBlank avec IsBlankOrError pour préserver le comportement de l’application existante. Avant l’ajout de la gestion des erreurs, une valeur vide était utilisée pour représenter à la fois les valeurs nulles des bases de données et les valeurs d’erreur. La gestion des erreurs sépare ces deux interprétations de Vide ce qui pourrait changer le comportement des applications existantes qui continuent à utiliser IsBlank.

La valeur renvoyée est une valeur booléenne true ou false.

L’utilisation de IsBlankOrError empêche tout traitement ultérieur de l’erreur.

Utilisez la fonction Error pour créer et signaler une erreur personnalisée. Par exemple, vous pouvez avoir une logique pour déterminer si une valeur donnée est valide pour votre contexte ou non, quelque chose n’est pas vérifié pour un problème automatiquement. Vous pouvez créer et renvoyer votre propre erreur, compléter avec Genre et Message, en utilisant le même enregistrement décrit ci-dessus pour la fonction IfError.

Dans le contexte de IfError, utilisez la fonction Error pour relancer ou transmettre par une erreur. Par exemple, votre logique dans IfError peut décider que dans certains cas une erreur peut être ignorée en toute sécurité, mais dans d’autres cas, l’erreur est importante à transmettre. Dans IfError ou App.OnError, utiliser Error( FirstError ) pour transmettre par une erreur.

La fonction Error peut également recevoir une table d’erreurs, comme ce serait le cas dans la table AllErrors. Utilisez Error( AllErrors ) pour relancer toutes les erreurs et pas seulement la première.

Un enregistrement vide ou une table vide transmis(e) aux résultats Erreur dans aucune erreur.

Syntaxe

Erreur( ErrorRecord )
Erreur( Tableau des erreurs )

  • ErrorRecord – Obligatoire. Enregistrement des informations d’erreur, y compris Genre, Message et d’autres champs. Kind est obligatoire. FirstError peut être transmis directement.
  • ErrorTable – Obligatoire. Table des enregistrements d’informations sur les erreurs. Toutes les erreurs peuvent être transmises directement.

IfError( Valeur1, Remplacement1 [, Valeur2 , Remplacement2, ... [, DefaultResult ] ] )

  • Valeurs – Obligatoire. Formule(s) à tester pour rechercher une valeur d’erreur.
  • Remplacements – requis. Formules à évaluer et valeurs à retourner si les arguments Value correspondants ont retourné une erreur.
  • DefaultResult – Facultatif. Les formules pour évaluer si la formule ne trouve aucune erreur.

IsError( Valeur )
IsBlankOrError( Valeur )

  • Valeur – Obligatoire. Formule à tester.

Exemples

IfError simple

Formule Description Résultat
SiErreur( 1, 2 ) Le premier argument n’est pas une erreur. La fonction n’a aucune autre erreur à vérifier et aucune valeur de retour par défaut. La fonction renvoie le dernier argument value évalué. 1
SiErreur( 1/0, 2 ) Le premier argument retourne une valeur d’erreur (due à la division par zéro). La fonction évalue le deuxième argument et le renvoie comme résultat. 2
SiErreur( 10, 20, 30 ) Le premier argument n’est pas une erreur. La fonction n’a aucune autre erreur à vérifier mais a valeur de retour par défaut. La fonction renvoie l’argument DefaultResult. 30
SiErreur( 10, 11, 20, 21, 300 ) Le premier argument 10 n’est pas une erreur, donc la fonction n’évalue pas le remplacement correspondant de cet argument 11. Le troisième argument 20 n’est pas une erreur non plus, donc la fonction n’évalue pas le remplacement correspondant de cet argument 21. Le cinquième argument 300 n’a pas de remplacement correspondant et est le résultat par défaut. La fonction renvoie ce résultat car la formule ne contient aucune erreur. 300
IfError( 1/0, Notify( "Il y a eu un problème interne" ) ) Le premier argument retourne une valeur d’erreur (due à la division par zéro). La fonction évalue le second argument et affiche un message à l’utilisateur. La valeur de retour de IfError est la valeur de retour de Notify, à laquelle est imposé le même type que celui du premier argument fourni à IfError (un nombre). 1

IsError simple

Formule Description Résultat
EstErreur( 1 ) L’argument n’est pas une erreur. FAUX
EstErreur(Vide() ) L’argument est un blanc, mais pas une erreur. FAUX
EstErreur( 1/0 ) L’argument est une erreur. vrai
Si( IsError( 1/0 ), Notify( "Il y a eu un problème interne" ) ) L’argument à IsError retourne une valeur d’erreur (due à la division par zéro). Cette fonction renvoie vrai, ce qui provoque la fonction If pour afficher un message à l’utilisateur avec la fonction Notify. La valeur de retour de If est la valeur de retour de Notify, à laquelle est imposé le même type que celui du premier argument fourni à If (un booléen). vrai

IsBlankOrError simple

Formule Description Résultat
EstVideOuErreur( 1 ) L’argument n’est pas une erreur ou vide. FAUX
EstVideOuErreur(Vide() ) L’argument est un blanc. vrai
EstVideOuErreur( 1/0 ) L’argument est une erreur. vrai

Erreur simple

Dans cet exemple, les dates sont validées les unes par rapport aux autres, ce qui entraîne une erreur en cas de problème.

If( StartDate > EndDate,
    Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )

Dans cet exemple, certaines erreurs sont autorisées à passer tandis que d’autres sont supprimées et remplacées par une valeur. Dans le premier cas, b est dans un état d’erreur car la fonction Value a un argument non valide. Parce que cela est inattendu par le rédacteur de la formule, cela est transmis pour que l’utilisateur le voie. Dans le deuxième cas, avec la même formule, b a la valeur 0, ce qui donne une division par zéro. Dans ce cas, l’auteur de la formule peut savoir que cela est acceptable pour cette logique, supprimez l’erreur (aucune bannière n’est affichée) et renvoyez -1 à la place.

With( {a: 1, b: Value("a")},
      IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns an error with Kind = ErrorKind.InvalidArgument

With( {a: 1, b: 0} )
      IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns -1

La table AllErrors peut être filtrée comme n’importe quelle autre table. Utilisées avec la fonction Error, les erreurs attendues peuvent être supprimées et les erreurs restantes conservées et signalées. Par exemple, si nous savions que la division par zéro ne poserait pas de problème dans un contexte particulier, ces erreurs pourraient être filtrées, laissant toutes les autres erreurs intactes avec la formule suivante :

Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )

Pas à pas

  1. Ajoutez un contrôle Text input et nommez-le TextInput1 s’il n’a pas ce nom par défaut.

  2. Ajoutez un contrôle Label et nommez-le Label1 s’il n’a pas ce nom par défaut.

  3. Définissez la formule pour la propriété Text de Label1 sur :

    IfError( Value( TextInput1.Text ), -1 )
    
  4. Dans TextInput1, entrez 1234.

    Label1 affiche la valeur 1234 car il s’agit d’une entrée valide pour la fonction Value.

  5. Dans TextInput1, entrez ToInfinity.

    Label1 affiche la valeur -1 car ce n’est pas une entrée valide pour la fonction Value. Sans wrapping de la fonction Value avec IfError, l’étiquette n’afficherait aucune valeur, car la valeur d’erreur est traitée comme un vide.

Voir aussi

Référence de formule pour Power Apps