Jagamisviis:


Tõrketöötlus

Märkus.

Käesolevas artiklis kirjeldatud käitumine on saadaval ainult juhul, kui eelvaatefunktsioon Valemi taseme tõrke haldus asukohas Sätted>Peatsed funktsioonid>Eelvaade on sisse lülitatud. Lisateave. Lubatud funktsioonide kontrollimine

Ilmneb tõrkeid. Võrgud lagunevad, salvestusruum saab täis, ootamatud väärtused. On oluline, et teie loogika töötaks potentsiaalsete probleemide puhul jätkuvalt õigesti.

Vaikimisi vooguvad tõrked rakenduse valemite kaudu ja neist teatatakse rakenduse lõppkasutajale. Sel viisil saab lõppkasutaja teada, et juhtus midagi ootamatut, ta saab probleemi ise lahendada, kasutades teistsugust sisendit, või teavitada probleemist rakenduse omanikku.

Rakenduste valmistajana saate oma rakenduses esinevate vigade üle kontrolli võtta.

  • Vea tuvastamine ja käsitlemine. Kui on tõenäoline, et ilmneb tõrge, saab kirjutada rakenduse valemid, et tuvastada vea seisund ja proovida toimingut uuesti. Lõppkasutaja ei pea muretsema, et viga tekkis, kuna tegija arvestas võimalusega. Seda tehakse valemis funktsioonidega IfError, IsError ja IsErrorOrBlank.
  • Tõrkest teatamine. Kui viga ei käsitleta valemis, kus see ilmnes, kuvatakse tõrge seejärel töötlejasse App.OnError. Siin ei saa enam seda tõrget asendada, kuna see on juba aset leidnud, ja see on osa valemiarvutustest. Kuid saate kasutada funktsiooni App.OnError, et juhtida seda, kuidas veast lõppkasutajale teatatakse, sealhulgas tõrketeadete koos keelamiseks. App.OnError annab ka üldpunkti tõrkearuandluse jaoks kogu rakenduses.
  • Tõrke loomine ja uuesti esiletoomine. Lõpuks võite tuvastada oma loogikaga veatingimuse, mis on teie rakendusele omane. Kasutage kohandatud tõrgete loomiseks funktsiooni Tõrge. Funktsiooni Error kasutatakse ka tõrketeate uuesti kõrvaldamiseks pärast seda, kui seda küsitakse jaotises IfError või App.OnError.

Alustamine

Alustame lihtsa näitega.

  1. Looge Power Appsi lõuendirakenduses uus ekraan.
  2. Sisestage TextInput juhtelement. Vaikimisi on selleks nimi TextInput1.
  3. Sisestage juhtelement Silt.
  4. Määrake Silt juhtelemendi atribuudile Tekst valem
1/Value( TextInput1.Text )

Tekstisisestuselementi, mis sisaldab teksti

Meil on viga, kuna juhtelemendi tekstiväli vaiketekst on "Text input", mida ei saa numbriks teisendada. Vaikimisi on see hea: lõppkasutaja saab teate, et miski ei tööta rakenduses eeldatud viisil.

Ilmselgelt ei taha me, et kasutajat tervitataks iga kord, kui ta seda rakendust käivitab. Tõenäoliselt "Text input" pole see tekstisisestusvälja jaoks õige vaikesäte. Selle probleemi lahendamiseks muutkem juhtelemendi Tekstisisend atribuut Vaikimisi järgmiselt:

Blank()

Kuvatakse veariba, millel on

Hmm, nüüd on meil erinev viga. Matemaatilised toimingud tühjaga, nagu jagamine, sunnivad tühja väärtuse nulliks. Ja see põhjustab nüüd allüksuse nullmääraga tõrke. Probleemi lahendamiseks peame otsustama, milline on selles rakenduses selle olukorra jaoks sobiv käitumine. Vastus võib olla tühja kuvamine, kui tekstisisestus on tühi. Saame seda saavutada, mähkides oma valemi funktsiooniga IfError:

IfError( 1/Value( TextInput1.Text ), Blank() )

Veariba ei kuvata, tühjast väärtusest tingitud viga on asendatud tühjaga

Nüüd on viga asendatud kehtiva väärtusega ja veabänner on kadunud. Kuid võib-olla oleme ületanud, kasutatav IfError katab kõik vead, sealhulgas halva väärtuse sisestamise, näiteks "hello". Me saame probleemi lahendada, häälestades meie IfError tõrget, et allüksusega tegeleda ainult nulljuhtumiga, ja kutsuda esile kõik muud tõrked.

IfError( 1/Value( TextInput1.Text ), 
         If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )

Veabännerit ei kuvata, konkreetselt nulliga jagamisest tingitud viga on asendatud tühjaga, vastasel juhul visatakse viga uuesti

Nii et käivitage meie rakendus ja proovige mõnda muud väärtust.

Ilma väärtuseta, nagu rakenduse käivitamisel, ei kuvata vastust, kuna vaikeväärtus on tühi, kuid ei kuvata ka viga, kuna IfError asendab nulliga jagamise veaga.

Vastust ei kuvata ja veariba pole

Kui sisestame 4, saame oodatud tulemuse 0,25:

Kuvatud on 0,25 ja veariba pole

Ja kui sisestame midagi ebaseaduslikku, näiteks hello, kuvatakse veabänner:

Väärtust ei kuvata ja kuvatakse tõrkeriba, kui

See on lihtne sissejuhatav näide. Tõrkekäsitlust saab teha mitmel viisil, olenevalt rakenduse vajadustest.

  1. Veabänneri asemel oleksime võinud valemiga sildi juhtelemendis kuvada "#Error". Et asenduste tüübid ühilduksid IfError esimese argumendiga, peame numbrilise tulemuse funktsiooni Tekst abil tekstistringiks teisendama.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Veariba pole ja selle asemel kuvatakse tulemusena #Error
  2. Selle asemel, et murdaks selle kindla eksemplari IfError väljaga, oleks meil võimalik kirjutada tsentraliseeritud käsitleja App.OnError. Me ei saa asendada kuvatud stringiga „#Error”, kuna viga on juba juhtunud ja App.OnError on ette nähtud ainult aruandluse juhtimiseks.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Vea levitamine

Vead voolavad läbi valemite samamoodi nagu Excelis. Kui näiteks Excel kasutab valemit A1, kuvab =1/0 A1 tõrkeväärtuse #DIV0!:

Exceli arvutustabel A1=1/0 ja #DIV/0! kuvatakse lahtris

Kui lahter A2 viitab näiteks A1 valemile =A1*2, siis levib tõrge ka selle valemi kaudu.

Exceli arvutustabel A2=A1*2 ja #DIV/0-ga! kuvatakse lahtris

See tõrge asendab väärtuse, mis oleks muidu arvutatud. Lahtris A2 pole korrutamise tulemust, ainult A1 jagamise viga.

Power Fx töötab samamoodi. Üldiselt, kui funktsiooni või operaatori argumendina esitatakse viga, siis toimingut ei toimu ja sisendviga liigub läbi toimingu tulemusel. Näiteks Mid( Text( 1/0 ), 1, 1 ) tagastab nulliga jagamise vea, kuna suurem osa sisemisest veast läbib Tekst ja Mid funktsioon:

Veariba, mis näitab kehtetut toimingut: jagamine nulliga

Üldiselt ei läbi tõrked Power Apps juhtelemendi atribuute. Laiendame eelmist näidet täiendava juhtelemendiga, mis kuvatakse juhul, kui esimese sildi Text atribuut on tõrke olek.

Teisel sildi juhtelemendil ei kuvata ühtegi viga

See on hea, kui vead ei levi juhtelemendi kaudu, sest süsteem jälgib kõigi juhtelementide sisendis esinevaid vigu. Tõrge ei lähe kaotsi.

Enamik funktsioone ja operaatoreid järgib reeglit "viga sisse, viga välja", kuid on ka erandeid. Funktsioonid IsError, IsErrorOrBlank ja IfError on loodud vigadega töötamiseks, nii et need ei pruugi tõrget tagastada isegi siis, kui see neile edastatakse.

Tõrgete vaatlemine

Tõrkeid ei jälgita enne, kui nende väärtust on kasutatud.

Seetõttu ei pruugi ka funktsioonid If ja Select tõrketeadet tagastada, kui see edastatakse. Kaaluge valemit If( false, 1/0, 3 ). Selles valemis esineb nulliga jagamise viga, kuid kuna If ei võta seda haru väärtuse false tõttu, ei teata Power Fx ja Power Apps viga:

Veariba pole kuvatud atribuudiga Silt Tekst

Funktsiooni Määra kasutamine veaga ei teata veast hetkel, kui viga asetatakse muutujasse. Oletagem näiteks Power Appsi rakenduses on App.OnStart valem, mis asetab muutujasse x null-tõrkega allüksuse:

Tõrkeriba ei kuvata funktsioonikõne seadmisel rakenduses App.OnStart

Vigadest ei teatata, kuna koodile x ei viidata. Kuid hetkel, kui lisame sildi juhtelemendi ja määrame selle atribuudi Tekst väärtuseks x, kuvatakse tõrge:

Veariba, mis kuvatakse koos sildi juhtelemendiga, mis viitab muutujale x

Saate jälgida tõrkeid valemis funktsioonidega IfError, IsError ja IsErrorOrBlank. Nende funktsioonide abil saate tagastada alternatiivse väärtuse, teha alternatiivseid toiminguid või muuta viga enne, kui seda täheldatakse ja sellest teatatakse.

Tõrgete aruandlus

Pärast tõrke jälgimist tuleb järgmisena teatada tõrkest lõppkasutajale.

Erinevalt Excelist pole veatulemuse kuvamiseks alati mugavat kohta, kuna valemi tulemus võib juhtida juhtelemendi omadusi, nagu X- ja Y-koordinaadid, mille jaoks pole teksti kuvamiseks sobivat kohta. Iga Power Fx hostiga saab määrata, kuidas tõrked lõppkasutajale lõpuks kuvatakse ja kui palju tegija selle protsessi üle juhib. Power Appsis kuvatakse veabänner ja veast teatamise kontrollimiseks kasutatakse käsku App.OnError.

Oluline on märkida, et App.OnError ei saa viga asendada samamoodi nagu IfError. Kui käsk App.OnError käivitatakse, on tõrge juba ilmnenud ja tulemus on levinud teiste valemite kaudu. App.OnError saab ainult määrata, kuidas tõrge lõppkasutajale esitatakse, ja annab tegijale soovitud tõrke logimise.

Ulatuse muutujad FirstError ja AllErrors pakuvad kontekstiteavet vea või vigade kohta. Selles esitatakse teave tõrke laadi ning selle allika ja selle kohta, kus tõrge ilmnes.

Tõrke järel peatamine

Käitumisvalemid toetavad toimingu võtmist, andmebaaside muutmist ja oleku muutmist. Need valemid võimaldavad järjestuses teha rohkem kui ühte toimingut, kasutades aheldamisoperaatorit ; (või ;; olenevalt lokaadist).

Sel juhul näiteks kuvatakse T tabeli ruudustiku juhtelemendis esitatud sisu. Iga nupu valik muudab selle tabeli olekut kahe Patch päringuga:

Animatsioon, kus tabeli T kahte kirjet värskendatakse pärast iga nupuvajutust juhuslike numbritega

Aheldatud käitumisvalemis ei lõpe tegevused pärast esimest viga. Muutkem oma näidet nii, et esimeses Patch-päringus edastataks kehtetu indeksinumber. Teine Patch töötab hoolimata varasemast veast. Esimesest veast teatatakse lõppkasutajale ja see kuvatakse Studios veana juhtnupul:

Animatsioon, mis näitab ainult tabeli T teist kirjet, mida värskendatakse juhuslike numbritega pärast iga nupuvajutust, kusjuures esimene kirje põhjustab vea

IfError abil saab käivitamist pärast tõrke ilmnemist peatada. Sarnaselt funktsiooniga If annab selle funktsiooni kolmas argument koha toimingute käivitamiseks, mida saab käivitada ainult juhul, kui tõrget pole.

Animatsioon, mis ei näita muudatusi kummaski tabelis T olevas kirjes, kuna IfError takistab teise toimingu lõpuleviimist pärast tõrget

Kui mõne ForAll iteratsiooni ajal ilmneb viga, siis ülejäänud iteratsioonid ei peatu. ForAll on mõeldud iga iteratsiooni eraldi käivitamiseks, võimaldades paralleelset käivitamist. Kui valik ForAll on lõpule viidud, tagastatakse viga, mis sisaldab kõiki ilmnenud vigu (uurides AllErrors in IfError or App.OnError).

Näiteks annab järgmine valem tulemuseks, et ForAll tagastab kaks viga (nulliga jagamisel Value korral kaks korda) ja Collection sellel on kolm kirjet (kui Value ei ole 0): [1, 2, 3].

Clear( Collection ); 
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );

Mitme tõrkega töötamine

Kuna käitumisvalem võib käivitada rohkem kui ühe toimingu, võib see esineda ka rohkem kui ühe veaga.

Vaikimisi esitatakse esimene tõrge lõppkasutajale. Selles näites nurjuvad mõlemad Patch-päringud, teine nulliga jagamise veaga. Kasutajale kuvatakse ainult esimene tõrge (registri kohta):

Vearibal kuvatakse esimene indeksiviga, teist viga ei teatata

Funktsioonid IfError ja App.OnError pääsevad juurde kõikidele vigadele, mis ilmnesid ulatuse muutuja AllErrors puhul. Sel juhul saame määrata selle globaalseks muutujaks ja vaadata mõlemat leitud viga. Need kuvatakse tabelis samas järjekorras, milles need esinesid:

Vigade jäädvustamine globaalsesse muutujasse PatchErrors, kus näeme, et mõlemad vead esinevad

Ka mittekäitumisvalemites saab tagastada mitu viga. Näiteks funktsiooni Patch kasutamine koos värskendatavate kirjete partiiga võib tagastada mitu viga, üks iga ebaõnnestunud kirje kohta.

Tabelite tõrked

Nagu varem nägime, saab vigu salvestada muutujatesse. Tõrkeid saab kaasata ka andmestruktuuridesse (nt tabelitesse). See on oluline, et ühegi kirje viga ei muudaks tervet tabelit kehtetuks.

Näiteks kaaluge seda andmetabeli juhtelementi Power Appsis.

Andmetabel, kus on kuvatud välja Vastastikune viga sisendi 0 korral, mille tulemuseks on jagamine nullveaga

Arvutamisel jaotises AddColumns ilmnes ühe väärtuse nulliga jagamise viga. Selle ühe kirje puhul on veerus Vastastikune veaväärtus (jagamine nulliga), kuid teistel kirjetel pole ja need on korras. IsError( Index( output, 2 ) ) tagastab väärtuse Väär ja tagastab IsError( Index( output, 2 ).Value ) väärtuse Tõene.

Kui tabeli filtreerimisel ilmneb tõrge, on kogu kirje viga, kuid see tagastatakse siiski tulemuses, nii et lõppkasutaja teab, et seal on midagi ja probleem on olemas.

Näiteks see. Siin pole algses tabelis vigu, kuid filtreerimine tekitab vea alati, kui Väärtus võrdub 0-ga:

Andmetabel, kus on kuvatud tõrked kahe kirje puhul, mida ei saanud filtrikriteeriumidega töödelda

Väärtused -5 ja -3 on korralikult välja filtreeritud. Väärtused 0 põhjustavad filtri töötlemisel tõrke ja seetõttu on ebaselge, kas kirje tuleks tulemusesse kaasata või mitte. Selleks, et lõppkasutajad ja abitegijad oleks võimalikult läbipaistmatud, lisame algse kirje asemele tõrkekirje. Sel juhul tagastab IsError( Index( output, 2 ) ) väärtuse Tõene.

Andmeallika tõrked

Funktsioonid, mis muudavad andmeid andmeallikas, nagu näiteks Paik, Kogu, Eemalda, RemoveIf, Värskenda, UpdateIf ja SubmitForm, teatavad tõrkeid kahel viisil.

  • Kõik need funktsioonid tagastavad toimingu tulemusena tõrkeväärtuse. Nagu ikka, on tõrkeid võimalik tuvastada funktsiooniga IsError ja asendada või keelata funktsiooniga IfError ning App.OnError.
  • Toimingu järel tagastab funktsioon Tõrked ka eelmiste toimingute tõrked. See võib olla kasulik tõrketeate kuvamisel vormi kuval, ilma et oleks vaja jäädvustada tõrget oleku muutujas.

Näiteks kontrollib see valem, kas funktsioonis Kogu on viga, ja kuvab kohandatud veateate:

IfError( Collect( Names, { Name: "duplicate" } ),
         Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )

Funktsioon Tõrked tagastab ka teavet käitusaegsete toimingute ajal ilmnenud vigade kohta. See võib olla kasulik tõrke kuvamisel vormi kuval, ilma et oleks vaja jäädvustada tõrget oleku muutujas.

Kukutamistõrked

Mõnikord on oodata mõningaid võimalikke vigu ja neid saab ohutult ignoreerida. Kui jaotistes IfError ja App.OnError tuvastatakse tõrge, mis tuleks edasi anda järgmisele kõrgemale käitlejale, saab selle uuesti tühistada käsuga Error( AllErrors ).

Oma tõrgete loomine

Error funktsiooniga saate luua ka oma tõrkeid.

Oma vigade loomisel on soovitatav kasutada väärtusi üle 1000, et vältida võimalikke vastuolusid süsteemi tulevaste tõrkeväärtustega.

ErrorKind loendi väärtused

ErrorKindi loend Väärtus Kirjeldus
AnalysisError 18 Süsteemitõrge. Tekkis probleem kompilaatori analüüsiga.
BadLanguageCode 14 Kasutati kehtetut või tundmatut keelekoodi.
BadRegex 15 Kehtetu regulaaravaldis. Kontrollige funktsioonide IsMatch, Match või MatchAll puhul kasutatavat süntaksit.
Konflikt 6 Värskendamist vajav kirje on juba lähtes muudetud ja konflikt tuleb lahendada. Levinud lahendus on kohalike muudatuste salvestamine, kirje värskendamine ja muudatuste uuesti rakendamine.
ConstraintViolated 8 Kirje ei läbinud serveris piirangute kontrolli.
CreatePermission 3 Kasutajal pole andmeallika jaoks kirje loomise luba. Näiteks kutsutakse esile funktsiooni Kogu.
DeletePermissions 5 Kasutajal pole andmeallika jaoks kirje kustutamise luba. Näiteks kutsutakse esile funktsiooni Eemalda.
Div0 13 Nulliga jagamine.
EditPermissions 4 Kasutajal pole andmeallika jaoks kirje loomise luba. Näiteks kutsutakse esile funktsiooni Lapi.
GeneratedValue 9 Serverile edastati ekslikult välja väärtus, mille server arvutab automaatselt.
InvalidFunctionUsage 16 Funktsiooni vale kasutamine. Sageli on funktsiooni üks või mitu argumenti valed või neid kasutatakse sobimatul viisil.
FileNotFound 17 SaveData salvestusruumi ei leitud.
InsufficientMemory 21 Seadmel pole toimingu jaoks piisavalt mälu või mäluruumi.
InvalidArgument 25 Funktsioonile anti üle kehtetu argument.
Sisemine 26 Süsteemitõrge. Ühe funktsiooniga seoses oli sisemine probleem.
MissingRequired 2 Kirje nõutud väli oli puudu.
Võrk 23 Võrguühendusega tekkis probleem.
Pole 0 Süsteemitõrge. Tõrkeid pole.
Pole rakendatav 27 Ühtegi väärtust pole saadaval. Kasulik on eristada tühi väärtust, mida saab väärtuse kasutamisel käsitleda arvarvutustes nullina, mis tuleb väärtuse kasutamisel potentsiaalse probleemina märkida.
NotFound 7 Kirjet ei leitud. Näiteks kirje, mida muudetakse funktsioonis Lapi.
NotSupported 20 See mängija või seade ei toeta seda toimingut.
Numbriline 24 Numbrifunktsiooni kasutati valesti. Näiteks Sqrt koos -1-ga.
QuoteExceeded 22 Salvestuskvoot on ületatud.
ReadOnlyValue 10 Veerg on kirjutuskaitstud ja seda ei saa muuta.
ReadPermission 19 Kasutajal pole andmeallika jaoks kirje lugemise luba.
Sünkroonimine 1 Andmeallikas teatas tõrkest. Vaadake lisateavet veerust Sõnum.
Teadmata 12 Ilmnes tõrge, kuid tundmatut tüüpi.
Valideerimine 11 Kirje ei läbinud valideerimiskontrolli.