De functies Error, IfError, IsError en IsBlankOrError

Van toepassing op: Canvas-apps Dataverse-formulekolommen Bureaubladstromen Modelgestuurde apps 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.

Opmerking

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 omdat 1/x een fout oplevert. 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 voor de Vervangende formules of het Standaardresultaat worden gebruikt. 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 veranderd zodat het overeenkomt met het type van het eerste argument.

Excel geeft #DIV/0! weer wanneer een deling door nul plaatsvindt.

Stel dat in plaats daarvan IfError als volgt wordt gebruikt:

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

De bovenstaande formule werkt niet. De teksttekenreeks "#DIV/0!" wordt gedwongen veranderd in het type van het eerste argument voor IfError, wat een getal is. Het resultaat van IfError levert nog een andere fout op omdat de teksttekenreeks niet gedwongen kan worden veranderd. 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 naar de eerste record van deze tabel vormt. FirstError retourneert altijd dezelfde waarde als First( AllErrors ).

De foutrecords omvatten:

Veld Type Beschrijving
Soort 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 is gebonden aan een eigenschap van een besturingselement bevindt deze zich bijvoorbeeld in het formulier ControlName.PropertyName.
Waargenomen Teksttekenreeks Locatie waar de fout is opgedoken voor de gebruiker, gebruikt voor rapportage. Voor een formule die is gebonden aan een eigenschap van een besturingselement bevindt deze zich bijvoorbeeld in het formulier ControlName.PropertyName.
Details Record Details over de fout. Op dit moment worden alleen details voor netwerkfouten verstrekt. Deze record omvat HttpStatusCode die de HTTP-statuscode bevat en HttpResponse 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:

Het besturingselement Button is geactiveerd met een melding van de functie Notify.

Meestal is er maar één fout waar FirstError voldoende mee 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.

Als IsError wordt gebruikt, wordt verdere verwerking van de fout voorkomen.

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. Voorafgaand aan de toevoeging van foutafhandeling is 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.

Het gebruik van IsBlankOrError voorkomt verdere verwerking van de fout.

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

Error( ErrorRecord )
Error( ErrorTable )

  • ErrorRecord: vereist. Foutinformatierecord, inclusief Soort, Bericht en andere velden. Soort is vereist FirstError kan direct worden doorgegeven.
  • ErrorTable: vereist. Tabel met foutinformatierecords. AllErrors kan direct worden doorgegeven.

IfError( Waarde1, Vervanging1 [, Waarde2, Vervanging2, ... [, Standaardresultaat ] ] )

  • Value(s): vereist. Formule(s) om te testen op foutwaarden.
  • Replacement(s): 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 )

  • Value: vereist. Formule om te testen.

Voorbeelden

Eenvoudige IfError

Formule Beschrijving Resultaat
IfError( 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
IfError( 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
IfError( 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
IfError( 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 is een intern probleem opgetreden" ) ) 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
IsError( 1 ) Het argument is geen fout. false
IsError( Blank() ) Het argument is leeg, maar geen fout. false
IsError( 1/0 ) Het argument is een fout. true
If( Error( 1/0 ), Notify( "Er is een intern probleem opgetreden" ) ) 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). true

Eenvoudige IsBlankOrError

Formule Beschrijving Resultaat
IsBlankOrError( 1 ) Het argument is geen fout en is niet leeg. false
IsBlankOrError( Blank() ) Het argument is leeg. true
IsBlankOrError( 1/0 ) Het argument is een fout. true

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 heeft b een foutstatus omdat de functie Value een ongeldig argument heeft. Omdat dit niet verwacht wordt door de formuleschrijver, wordt het doorgegeven zodat de gebruiker het zal zien. In het tweede geval, met dezelfde formule, heeft b 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 wisten dat delen door nul in een bepaalde context geen probleem zou zijn, zouden die fouten met de volgende formule eruit kunnen worden gefilterd, zodat alle andere fouten intact blijven:

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

Stapsgewijs

  1. Voeg het besturingselement Text input toe en geef het de naam TextInput1 als het element die naam niet standaard krijgt.

  2. Voeg het besturingselement Label toe en geef het de naam Label1 als het element die naam niet standaard krijgt.

  3. Stel de formule voor de eigenschap Text van Label1 in op:

    IfError( Value( TextInput1.Text ), -1 )
    
  4. Voer in TextInput1 de waarde 1234 in.

    Label1 toont de waarde 1234 omdat dit geldige invoer is voor de functie Value.

  5. Voer in TextInput1 de waarde ToInfinity in.

    Label1 toont de waarde -1 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.

Zie ook

Formuleverwijzing voor Power Apps