De functies Error, IfError, IsError en IsBlankOrError
Van toepassing op: Canvas-apps Dataverse formulekolommen Bureaublad-stromen Modelgestuurde apps Power Pages Power Platform CLI
Hiermee worden fouten gedetecteerd en wordt er een alternatieve waarde opgegeven of actie ondernomen. Maak een aangepaste fout of geef een fout door.
Notitie
Als een app de functie Foutbeheer op formuleniveau onder instellingen>Updates>Uitgeschakeld heeft uitgeschakeld, werken deze functies niet correct.
IfError
Met de functie IfError worden waarden getest totdat er een fout wordt gevonden. Als de functie een fout detecteert, evalueert en retourneert de functie een overeenkomende vervangende waarde en wordt verdere evaluatie gestopt. Er kan ook een standaardwaarde worden opgegeven als er geen fouten worden gevonden. De structuur van IfError lijkt op de structuur van de functie If: IfError test op fouten en If test op true.
Gebruik IfError om een fout te vervangen door een geldige waarde, zodat de berekeningen verderop kunnen worden voortgezet. Gebruik deze functie bijvoorbeeld als gebruikersinvoer kan resulteren in een deling door nul:
IfError( 1/x, 0 )
Deze formule retourneert 0
als de waarde van x
nul is, aangezien 1/x
een fout produceert. Als x
niet nul is, wordt 1/x
geretourneerd.
De verdere verwerking wordt gestopt
Wanneer formules aan elkaar worden gekoppeld in gedragsformules, zoals:
Patch( DS1, ... );
Patch( DS2, ... )
Er wordt geprobeerd de tweede functie Patch naar DS2
uit te voeren, zelfs als de Patch naar DS1
mislukt. Het bereik van een fout wordt beperkt tot elke formule die is gekoppeld.
Gebruik IfError om een actie uit te voeren en alleen door te gaan met verwerken als de actie is uitgevoerd. IfError toegepast op dit voorbeeld:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ),
Patch( DS2, ... ), Notify( "problem in the second action" )
)
Als er bij de Patch van DS1
een probleem optreedt, wordt de eerste Notify uitgevoerd. Er vindt geen verdere verwerking plaats en ook de tweede Patch van DS2
wordt niet uitgevoerd. Als de eerste Patch kan worden uitgevoerd, wordt ook de tweede Patch uitgevoerd.
Als het optionele argument Standaardresultaat is opgegeven wordt het argument geretourneerd als er geen fouten worden gedetecteerd. Zonder dit argument wordt het laatste Waarde-argument geretourneerd.
Voortbouwend op het laatste voorbeeld kan de retourwaarde van IfError worden gecontroleerd om vast te stellen of er problemen zijn:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ); false,
Patch( DS2, ... ), Notify( "problem in the second action" ); false,
true
)
Typecompatibiliteit
IfError retourneert de waarde van een van de argumenten. De typen van alle waarden die door IfError kunnen worden geretourneerd, moeten compatibel zijn.
In het laatste voorbeeld retourneert Patch een record die niet compatibel is met de Booleaanse waarden die worden gebruikt voor de Vervangingsformules of het Standaardresultaat. Dat is prima, omdat er geen situatie is waarin de retourwaarde van deze Patch-aanroepen door IfError wordt geretourneerd.
Notitie
Hoewel het gedrag zal worden veranderd, moeten de typen van alle argumenten voor IfError momenteel nog compatibel zijn.
In het eerder beschreven eenvoudige voorbeeld:
IfError( 1/x, 0 )
De soorten 1/x
en 0
zijn compatibel omdat beide getallen zijn. Als dat niet het geval is, wordt het tweede argument gedwongen om overeen te komen met het type van het eerste argument.
Excel geeft #DIV/0! weer wanneer er door nul wordt gedeeld.
Stel dat in plaats daarvan IfError als volgt wordt gebruikt:
IfError( 1/x, "#DIV/0!" )
De bovenstaande formule werkt niet. De tekststring "#DIV/0!"
wordt gedwongen naar het type van het eerste argument van IfError, wat een getal is. Het resultaat van IfError is nog een fout, omdat de tekstreeks niet kan worden afgedwongen. Om dit op te lossen kunt u het eerste argument omzetten in een teksttekenreeks, zodat IfError altijd een teksttekenreeks retourneert:
IfError( Text( 1/x ), "#DIV/0!" )
Zoals hierboven te zien is, kan IfError een fout retourneren als de Vervanging of het Standaardresultaat een fout is.
FirstError / AllErrors
Binnen de vervangingsformules is informatie over de gevonden fouten beschikbaar via de record FirstError en de tabel AllErrors. AllErrors is een tabel met foutinformatierecords, waarbij FirstError een snelkoppeling is naar het eerste record in deze tabel. FirstError retourneert altijd dezelfde waarde als First( AllErrors ).
De foutrecords omvatten:
Veld | Type | Beschrijving |
---|---|---|
Vriendelijk | ErrorKind-enum (getal) | Categorie van de fout. |
Bericht | Teksttekenreeks | Bericht over de fout, geschikt voor weergave aan de eindgebruiker. |
Bron | Teksttekenreeks | Locatie waar de fout is ontstaan, gebruikt voor rapportage. Voor een formule die bijvoorbeeld aan een besturingselementeigenschap is gekoppeld, heeft deze waarde de vorm ControlName.PropertyName. |
Geobserveerd | Teksttekenreeks | Locatie waar de fout is opgedoken voor de gebruiker, gebruikt voor rapportage. Voor een formule die bijvoorbeeld aan een besturingselementeigenschap is gekoppeld, heeft deze waarde de vorm ControlName.PropertyName. |
Details | Opnemen | Details over de fout. Momenteel worden alleen details verstrekt over netwerkfouten. Deze record omvat HttpStatusCode die de HTTP-statuscode en HttpResponse bevat die de hoofdtekst van de respons van de connector of service bevat. |
Bekijk bijvoorbeeld de volgende formule als de eigenschap OnSelect van het besturingselement Button:
Set( a, 1/0 )
En deze formule op de eigenschap OnSelect van een tweede besturingselement Button:
IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )
De bovenstaande voorbeeldformule zou de volgende banner weergeven wanneer de twee knoppen na elkaar worden geactiveerd:
Normaal gesproken is er slechts één fout waarmee FirstError voldoende kan werken. Er zijn echter scenario's waarin meerdere fouten kunnen worden geretourneerd. Bijvoorbeeld bij gebruik van een operator voor formulekoppeling of de functie Concurrent. Zelfs in deze situaties kan melding van FirstError voldoende zijn om een probleem aan het licht te brengen in plaats van een gebruiker te overbelasten met meerdere fouten. Als u nog steeds een vereiste hebt om met elke fout afzonderlijk te werken, kunt u de tabel AllErrors gebruiken.
IsError
De functie IsError test op een foutwaarde.
De retourwaarde is de booleaanse waarde true of false.
Door IsError te gebruiken, voorkomt u dat de fout verder wordt verwerkt.
IsBlankOrError
De functie IsBlankOrError test op een lege waarde of een foutwaarde en is het equivalent van Or( IsBlank( X ), IsError( X ) )
.
Overweeg, bij het inschakelen van foutafhandeling voor bestaande apps, IsBlank te vervangen door IsBlankOrError om bestaand appgedrag te behouden. Vóór de toevoeging van foutverwerking werd een lege waarde gebruikt om zowel null-waarden uit databases als foutwaarden weer te geven. Foutafhandeling scheidt deze twee interpretaties van leeg die het gedrag kunnen veranderen van bestaande apps die IsBlank blijven gebruiken.
De retourwaarde is de booleaanse waarde true of false.
Door IsBlankOrError te gebruiken, voorkomt u dat de fout verder wordt verwerkt.
Gebruik de functie Error om een aangepaste fout te maken en te rapporteren. U kunt bijvoorbeeld logica hebben om te bepalen of een bepaalde waarde geldig is voor uw context of niet, iets waarbij niet automatisch op een probleem wordt gecontroleerd. U kunt uw eigen fout maken en retourneren, compleet met Soort en Bericht, met dezelfde record als hierboven beschreven voor de functie IfError.
Gebruik in de context van IfError de functie Error om een fout opnieuw te genereren of door te geven. Uw logica in IfError kan bijvoorbeeld besluiten dat in sommige gevallen een fout veilig kan worden genegeerd, terwijl het in andere gevallen belangrijk is om de fout door te sturen. Maak binnen IfError of App.OnError gebruik van Error( FirstError ) om een fout door te geven.
Aan de functie Error kan ook een tabel met fouten worden doorgegeven, zoals te vinden is in de tabel AllErrors. Gebruik Error (AllErrors) om alle fouten opnieuw te genereren en niet alleen de eerste.
Als een lege record of tabel wordt doorgegeven aan Error, resulteert dit niet in een fout.
Syntaxis
Fout( FoutRecord )
Fout( Fouttabel )
- ErrorRecord – Vereist. Foutinformatierecord, inclusief Soort, Bericht en andere velden. Kind is vereist. FirstError kan rechtstreeks worden doorgegeven.
- ErrorTable – Vereist. Tabel met foutinformatierecords. AllErrors kunnen rechtstreeks worden doorgegeven.
IfError( Waarde1, Vervanging1 [, Waarde2 , Vervanging2, ... [, StandaardResultaat ] ] )
- Waarden – Verplicht. Formule(s) om te testen op foutwaarden.
- Vervangingen – Vereist. De formules die moeten worden geëvalueerd en waarden die moeten worden geretourneerd als de overeenkomende Waarde- argumenten een fout hebben geretourneerd.
- DefaultResult – Optioneel. De formules die moeten worden geëvalueerd als de formule geen fouten vindt.
IsError( Waarde )
IsBlankOrError( Waarde )
- Waarde – Verplicht. Formule om te testen.
Voorbeelden
Eenvoudige IfError
Formule | Beschrijving | Resultaat |
---|---|---|
AlsFout( 1, 2 ) | Het eerste argument is geen fout. De functie heeft geen andere fouten om te controleren en geen standaardretourwaarde. De functie retourneert het laatste waarde-argument dat is geëvalueerd. | 1 |
AlsFout( 1/0, 2 ) | Het eerste argument retourneert een foutwaarde (als gevolg van een deling door nul). De functie evalueert het tweede argument en retourneert dit als resultaat. | 2 |
AlsFout( 10, 20, 30 ) | Het eerste argument is geen fout. De functie heeft geen andere fouten om te controleren, maar heeft een standaardretourwaarde. De functie retourneert het argument Standaardresultaat. | 30 |
AlsFout( 10, 11, 20, 21, 300 ) | Het eerste argument 10 is geen fout, dus de functie evalueert de overeenkomende vervanging 11 van dat argument niet. Het derde argument 20 is ook geen fout, dus de functie evalueert de overeenkomende vervanging 21 van dat argument niet. Het vijfde argument 300 heeft geen overeenkomende vervanging en is het standaardresultaat. De functie retourneert dat resultaat omdat de formule geen fouten bevat. | 300 |
IfError( 1/0, Notify( "Er was een intern probleem" ) ) | Het eerste argument retourneert een foutwaarde (als gevolg van een deling door nul). De functie evalueert het tweede argument en geeft een bericht voor de gebruiker weer. De retourwaarde van IfError is de retourwaarde van Notify en wordt gedwongen veranderd in hetzelfde type als het eerste argument voor IfError (een getal). | 1 |
Eenvoudige IsError
Formule | Beschrijving | Resultaat |
---|---|---|
IsFout( 1 ) | Het argument is geen fout. | vals |
IsError(Blanco() ) | Het argument is leeg, maar geen fout. | vals |
IsFout( 1/0 ) | Het argument is een fout. | WAAR |
If( IsError( 1/0 ), Notify( "Er was een intern probleem" ) ) | Het argument voor IsError retourneert een foutwaarde (als gevolg van een deling door nul). Deze functie retourneert true, waardoor de If een bericht aan de gebruiker weergeeft met de functie Notify. De retourwaarde van IfError is de retourwaarde van Notify die gedwongen is veranderd in hetzelfde type als het eerste argument van If (een booleaanse waarde). | WAAR |
Eenvoudige IsBlankOrError
Formule | Beschrijving | Resultaat |
---|---|---|
IsBlankOfFout( 1 ) | Het argument is geen fout en is niet leeg. | vals |
IsBlankOrError(Blank() ) | Het argument is leeg. | WAAR |
IsBlankOfFout( 1/0 ) | Het argument is een fout. | WAAR |
Eenvoudige fout
In dit voorbeeld worden datums ten opzichte van elkaar gevalideerd, wat resulteert in een fout als er een probleem is.
If( StartDate > EndDate,
Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )
In dit voorbeeld mogen sommige fouten doorgaan, terwijl andere worden onderdrukt en vervangen door een waarde. In het eerste geval bevindt b zich in een foutstatus omdat de Value functie een ongeldig argument heeft. Omdat de formuleschrijver dit niet verwacht, wordt dit doorgegeven zodat de gebruiker het ziet. In het tweede geval heeft b met dezelfde formule de waarde 0, wat resulteert in een deling door nul. In dit geval kan de formuleschrijver weten dat dit acceptabel is voor deze logica, de fout onderdrukken (er wordt geen banner weergegeven) en in plaats daarvan -1 retourneren.
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
De tabel AllErrors tabel kan worden gefilterd zoals elke andere tabel. Gebruikt met de functie Error kunnen verwachte fouten worden verwijderd en de resterende fouten worden behouden en gerapporteerd. Als we bijvoorbeeld zouden weten dat delen door nul in een bepaalde context geen probleem zou zijn, zouden we die fouten eruit kunnen filteren en alle andere fouten intact laten met de volgende formule:
Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )
Stapsgewijs
Voeg het besturingselement Text input toe en geef het de naam TextInput1 als het element die naam niet standaard krijgt.
Voeg het besturingselement Label toe en geef het de naam Label1 als het element die naam niet standaard krijgt.
Stel de formule voor de eigenschap Text van Label1 in op:
IfError( Value( TextInput1.Text ), -1 )
Voer in TextInput1 de waarde 1234 in.
Label1 toont de waarde 1234 omdat dit een geldige invoer is voor de functie Value.
Voer in TextInput1 de waarde ToInfinity in.
Label1 geeft de waarde -1 weer, omdat dit geen geldige invoer is voor de functie Value. Als u de functie Value niet verpakt met IfError, wordt voor het label geen waarde weergegeven omdat de foutwaarde wordt behandeld als een lege waarde.