Fonctions Error, IfError, IsError et IsBlankOrError
S'applique à : Applications Canvas
Colonnes de formule Dataverse
Flux de 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.
Remarque
- Le comportement décrit dans cet article n’est disponible que lorsque la fonctionnalité en version préliminaire Gestion des erreurs au niveau de la formule dans Paramètres > Fonctionnalités à venir > Version préliminaire est activée.
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 nulle, car 1/x
produira 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 renverra 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 renverra un enregistrement qui n’est pas compatible avec les valeurs booléennes utilisées pour les formules de Remplacement ou 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 sera contraint à correspondre au type du premier argument.
Excel affichera #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!"
sera contraint au type du premier argument de IfError, qui est un nombre. Le résultat de IfError sera encore une autre erreur car 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 où FirstError est un raccourci vers le premier enregistrement de cette table. FirstError renverra toujours la même valeur que First( AllErrors ).
Les enregistrements d’erreur incluent :
Champ | Type | Description |
---|---|---|
Genre | É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, celle-ci sera sous la forme ControlName.PropertyName. |
Observed | 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, celle-ci sera sous la forme ControlName.PropertyName. |
Détails | Enregistrer | Détails de l’erreur. À l’heure actuelle, les détails ne sont fournis que pour les erreurs de 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 :
Généralement, il n’y aura qu’une seule erreur que FirstError peut utiliser de manière suffisante. 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.
En utilisant IsError empêchera 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 a été utilisé 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.
Utilisant IsBlankOrError empêchera 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
Error( ErrorRecord )
Error( ErrorTable )
- ErrorRecord : obligatoire. Enregistrement des informations d’erreur, y compris Genre, Message et d’autres champs. Genre est obligatoire. FirstError peut être transmis directement.
- ErrorTable : obligatoire. Table des enregistrements d’informations sur les erreurs. AllErrors peut être transmis directement.
IfError( Value1, Replacement1 [, Value2, Replacement2, ... [, DefaultResult ] ] )
- Value(s) : obligatoire. Formule(s) à tester pour rechercher une valeur d’erreur.
- Replacement(s) : obligatoire. 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( Value )
IsBlankOrError( Valeur )
- Value : obligatoire. Formule à tester.
Exemples
IfError simple
Formule | Description | Résultat |
---|---|---|
IfError( 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 |
IfError( 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 |
IfError( 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 |
IfError( 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( "There was an internal problem" ) ) | 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 |
---|---|---|
IsError( 1 ) | L’argument n’est pas une erreur. | faux |
IsError( Blank() ) | L’argument est un blanc, mais pas une erreur. | faux |
IsError( 1/0 ) | L’argument est une erreur. | true |
If( IsError( 1/0 ), Notify( "There was an internal problem" ) ) | 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). | true |
IsBlankOrError simple
Formule | Description | Résultat |
---|---|---|
IsBlankOrError( 1 ) | L’argument n’est pas une erreur ou vide. | faux |
IsBlankOrError( Blank() ) | L’argument est un blanc. | true |
IsBlankOrError( 1/0 ) | L’argument est une erreur. | true |
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 sera dans un état d’erreur parce que la fonction Value a un argument non valide. Parce que l’auteur de la formule ne s’y attend pas, elle est transmise afin que l’utilisateur en prenne connaissance. Dans le second cas, avec la même formule, b aura la valeur 0, résultant en 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 n’allait pas être un 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
Ajoutez un contrôle Text input et nommez-le TextInput1 s’il n’a pas ce nom par défaut.
Ajoutez un contrôle Label et nommez-le Label1 s’il n’a pas ce nom par défaut.
Définissez la formule pour la propriété Text de Label1 sur :
IfError( Value( TextInput1.Text ), -1 )
Dans TextInput1, entrez 1234.
Label1 affiche la valeur 1234 car il s’agit d’une entrée valide pour la fonction Value.
Dans TextInput1, entrez ToInfinity.
Label1 affiche la valeur -1 car il ne s’agit pas d’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.