Obravnava napak
opomba,
Način delovanja, opisan v tem članku, je na voljo samo, ko je poskusna funkcija Upravljanje napak na ravni formule v razdelku Nastavitve>Prihodnje funkcije>Predogledna različica vklopljena. Več informacij: Nadzor nad tem, katere funkcije so omogočene
Napake se dogajajo. Omrežja se sesujejo, prostor za shranjevanje se napolni, pridobljene so nepričakovane vrednosti. Za soočanje s potencialnimi težavami je pomembno, da vaša logika še naprej pravilno deluje.
Napake se privzeto prenesejo prek formul aplikacije, obvestila o napakah pa se poročajo končnemu uporabniku aplikacije. Tako je končni uporabnik seznanjen z nepričakovanim dogajanjem in lahko morda težavo odpravi sam s spremembo vhoda ali pa o njej poroča lastniku aplikacije.
Kot ustvarjalec aplikacije lahko prevzamete nadzor nad napakami v vaši aplikaciji:
- Zaznavanje in obravnava napake. Če obstaja možnost, da pride do napake, lahko za aplikacijo napišete formule, ki zaznajo stanje napake in postopek poskušajo znova izvesti. Če je prišlo do napake, je lahko končni uporabnik brez skrbi, saj je ustvarjalec to možnost že upošteval. To lahko storite s funkcijami IfError, IsError in IsErrorOrBlank v formuli.
- Poročanje o napakah. Če napaka ni obravnavana v formuli, v kateri se je pojavila, se prikaže v rutini za obravnavo App.OnError. Tukaj napake ni več mogoče nadomestiti, saj se je že zgodila in je del izračunov formule. Vendar pa lahko z rutino za obravnavo App.OnError nadzorujete, kako bo napaka sporočena končnemu uporabniku, pri čemer lahko poročanje o napakah tudi popolnoma prekinete. App.OnError zagotavlja tudi skupno točko zadušitve za poročanje o napakah v celotni aplikaciji.
- Ustvarjanje in vnovičen priklic napake. Za zaznavanje stanja napake lahko uporabite lastno logiko oziroma pogoj, ki velja samo za vašo aplikacijo. Za ustvarjanje napak po meri uporabite funkcijo Error. Funkcija Error se uporablja tudi za vnovičen priklic napake po zaslišanju napake v IfError ali App.OnError.
Začetek
Začnimo s preprostim primerom.
- V aplikaciji s platnom storitve Power Apps ustvarite nov zaslon.
- Vstavite kontrolnik TextInput. Kontrolnik bo privzeto nastavljen na ime TextInput1.
- Vstavite kontrolnik Label.
- Nastavite lastnost Text kontrolnika Label na formulo
1/Value( TextInput1.Text )
Prikazala se je napaka, ker kontrolnik TextInput vsebuje privzeto besedilo "Text input"
, ki ga ni mogoče pretvoriti v številko. Običajno je to dobro: končni uporabnik bo prejel obvestilo, da v aplikaciji nekaj ne deluje po pričakovanjih.
Seveda pa ne želimo, da uporabnik ob vsakem zagonu te aplikacije najprej prejme obvestilo o napaki. "Text input"
najverjetneje tako ali tako ni ustrezna privzeta rešitev za polje za vnos besedila. To lahko popravimo tako, da lastnost Default kontrolnika TextInput spremenimo v:
Blank()
Hm, zdaj se prikaže druga napaka. Matematične operacije s prazno vrednostjo blank, kot je deljenje, bodo v prazno vrednost vsilile vrednost nič. Zato je zdaj prišlo do napake zaradi deljenja z nič. Da bi to odpravili, moramo ugotoviti, kateri način delovanja je v tej situaciji najprimernejši za to aplikacijo. Ena od rešitev bi lahko bila, da se prikaže vrednost blank, ko je vrednost vnosa besedila blank. To lahko dosežemo tako, da formulo obdamo s funkcijo IfError:
IfError( 1/Value( TextInput1.Text ), Blank() )
Zdaj je napaka nadomeščena z veljavno vrednostjo in pasica z napako je izginila. Toda ta rešitev je morda pretirana, saj smo uporabili IfError, ki zajema vse napake, vključno z napako zaradi vnosa neustrezne vrednosti, kot je "hello"
. To lahko rešimo tako, da funkcijo IfError oblikujemo tako, da bo obravnavala samo deljenje z nič in nato znova vrnila vse ostale napake:
IfError( 1/Value( TextInput1.Text ),
If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )
Zaženimo našo aplikacijo in poskusimo uporabiti drugačne vrednosti.
Če ni nobene vrednosti, kot na primer ob zagonu aplikacije, odgovor ne bo prikazan, saj je privzeta vrednost blank, prikazana pa ne bo niti nobena napaka, saj IfError nadomesti napako zaradi deljenja z nič.
Če vnesemo vrednost 4, dobimo pričakovani rezultat 0,25:
Če pa vnesemo nedovoljeno vrednost, kot na primer hello
, se bo prikazala pasica z napako:
To je preprost primer za predstavitev. Napake je mogoče obravnavati na različne načine, odvisno od potreb aplikacije:
- Namesto pasice z napako bi lahko v kontrolniku oznake s formulo prikazali "#Error". Da ohranimo združljivost vrst za nadomestitev s prvim argumentom za IfError, moramo številski rezultat izrecno pretvoriti v besedilni niz s funkcijo Text.
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- Namesto obdajana tega primerka s funkcijo IfError, bi lahko napisali centralizirano rutino za obravnavo App.OnError. Niza, prikazanega z oznako »#Error« ne moremo zamenjati, saj se je napaka že zgodila, App.OnError pa omogoča samo nadzor nad poročanjem.
If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
Razširjanje napak
Napake se prenesejo prek formul podobno kot v programu Excel. Če ima na primer celica A1
v programu Excel formulo =1/0
, bo v celici A1 prikazana vrednost napake #DIV0!
:
Če se celica A2
nanaša na celico A1
v svoji formuli, na primer =A1*2
, se bo napaka razširila tudi na to formulo:
Vrednost, ki bi se sicer izračunala, se zamenja z napako. V celici A2
ni rezultata množenja, prikazana je samo napaka zaradi deljenja v celici A1
.
Power Fx deluje na enak način. Če je napaka navedena kot argument za funkcijo ali operator, na splošno velja, da se operacija ne bo izvedla, vhodna napaka pa bo prenesena kot rezultat operacije. Formula Mid( Text( 1/0 ), 1, 1 )
bo na primer vrnila napako »Deljenje z nič«, saj se najbolj notranja napaka prenese prek funkcije Text in funkcije Mid:
Napake se na splošno ne prenesejo prek lastnosti kontrolnikov storitve Power Apps. Razširimo prejšnji primer z dodatnim kontrolnikom, ki prikaže, ali je lastnost prve oznake Text
stanje napake:
V redu je, da se napake ne razširjajo prek kontrolnika, saj bo sistem napake opazoval ob vnosu vseh lastnosti kontrolnika. Napaka ne bo izgubljena.
Večina funkcij in operatorjev sledi pravilu »napaka na vhodu, napaka na izhodu«, vendar obstaja nekaj izjem. Funkcije IsError, IsErrorOrBlank in IfError so namenjene delu z napakami, zato morda ne bodo vrnile napake, tudi če se kakšna prenese vanje.
Opazovanje napak
Napake niso opazovane, dokler ni uporabljena njihova vrednost.
Posledično tudi funkciji If in Select včasih ne vrneta napake, če se napaka prenese vanju. Oglejmo si formulo If( false, 1/0, 3 )
. Formula vsebuje napako zaradi deljenja z nič, toda funkcija If
ne prevzame te veje, ker false
, Power Fx in storitev Power Apps ne bosta javili napake:
Ob uporabi funkcije Set z napako se obvestilo o napaki ne bo prikazalo v trenutku, ko je napaka vnesena v spremenljivko. V storitvi Power Apps ta formula v App.OnStart v spremenljivko x
vstavi napako zaradi deljenja z nič:
Obvestila o napaki ni, ker ni sklica na spremenljivko x
. Toda napaka se prikaže takoj, ko dodamo kontrolnik oznake in njegovo lastnost Text nastavimo na x
:
Napako znotraj formule lahko opazujete s funkcijami IfError, IsError in IsErrorOrBlank. S temi funkcijami lahko vrnete nadomestno vrednost, izvedete nadomestno dejanje ali spremenite napako še preden je opažena in prijavljena.
Poročanje o napakah
Ko opazite napako, je naslednji korak, da o njej poročate končnemu uporabniku.
Za razliko od programa Excel, primerno mesto za prikaz rezultata napake ni vedno na voljo, saj lahko rezultat formule ustvari lastnost, kot sta koordinati X in Y kontrolnika, za katerega ni primernega mesta za prikaz besedila. Vsak gostitelj Power Fx nadzoruje, kako so napake na koncu prikazane končnemu uporabniku in koliko nadzora ima ustvarjalec nad tem postopkom. V storitvi Power Apps je prikazana pasica z napako in App.OnError se uporablja za nadzor nad načinom poročanja o napaki.
Pomembno je, da upoštevate, da App.OnError napake ne more zamenjati tako kot jo funkcija IfError . Ko se rutina za obravnavo App.OnError izvede, se je napaka namreč že zgodila in njen rezultat se je razširil na druge formule. App.OnError nadzira samo, kako se napaka sporoči končnemu uporabniku, in izdelovalcu zagotavlja kavelj, da po želji zabeleži napako.
Spremenljivki obsega FirstError in AllErrors podajata zagotavljata informacije o kontekstu napake oziroma napak. Slednji ponuja informacije o tem, za kakšno napako gre, kje je nastala in kje je bila opažena.
Zaustavitev po napaki
Formule vedenja so v pomoč pri ukrepanju, spreminjanju zbirk podatkov in spreminjanju stanja. Te formule omogočajo izvajanje več dejanj v zaporedju z operaterjem veriženja ;
(ali ;;
, odvisno od območnih nastavitev).
V tem primeru na primer kontrolnik mreže prikazuje, kaj je v tabeli T
. Z vsako izbiro gumba se spremeni stanje v tej tabeli z dvema klicema funkcije Patch:
V formuli verižnega vedenja se dejanja ne zaustavijo po prvi napaki. Spremenimo naš primer tako, da bo v prvem klicu funkcije Patch posredovana neveljavna številka kazala. Druga funkcija Patch se nadaljuje kljub predhodni napaki. Prva napaka je sporočena končnemu uporabniku in je v storitvi Studio v kontrolniku prikazana kot napaka:
IfError lahko uporabite za ustavitev izvajanja po napaki. Tretji argument za to funkcijo podobno kot pri funkciji If zagotavlja prostor za vnos dejanj, ki se morajo izvesti samo, če ni nobene napake:
Če se med eno od ponovitev funkcije ForAll pojavi napaka, se ostale ponovitve ne bodo zaustavile. ForAll je zasnovan za neodvisno izvajanje vsake ponovitve, kar omogoča vzporedno izvajanje. Ko se funkcija ForAll dokonča, se vrne napaka, ki vsebuje vse zaznane napake (po pregledovanju funkcij AllErrors in IfError ali rutine App.OnError).
Ta formula bo na primer povzročila, da funkcija ForAll vrne dve napaki (zaradi deljenja z nič za vrednost Value
0 – dvakrat) in Collection
imela bo tri zapise (za primere, ko vrednost Value
ni 0): [1, 2, 3]
.
Clear( Collection );
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );
Delo z več napakami
Formula vedenja lahko izvede več dejanj, zato lahko tudi zazna več napak.
Privzeto je končnemu uporabniku sporočena prva napaka. V tem primeru bosta oba klica funkcije Patch neuspešna, saj se bo pri drugem klicu prikazala napaka zaradi deljenja z nič. Uporabniku se prikaže samo prva napaka (o kazalu):
Funkcija IfError in rutina za obravnavo App.OnError lahko dostopata do vseh napak, odkritih s spremenljivko obsega AllErrors. V našem primeru jo lahko nastavimo na globalno spremenljivko in si ogledamo obe odkriti napaki. V tabeli sta prikazani v vrstnem redu, po katerem sta bili odkriti:
Več napak je mogoče vrniti tudi s formulami, ki niso formule vedenja. Tudi funkcija Patch, uporabljena s paketom zapisov za posodobitev, lahko vrne več napak – po eno za vsak zapis, ki ne uspe.
Napake v tabelah
Kot smo videli prej, se lahko napake shranijo v spremenljivke. Napake so lahko vključene tudi v strukture podatkov, kot so tabele. Pomembno je upoštevati, da lahko napaka v katerem koli posameznem zapisu razveljavi celotno tabelo.
Oglejmo si na primer ta kontrolnik podatkovne tabele v storitvi Power Apps:
Izračun v AddColumns je v eni od vrednosti odkril napako zaradi deljenja z nič. Stolpec Vzajemno za ta zapis vsebuje vrednost napake (deljenje z nič), drugi zapisi pa ne vsebujejo te vrednosti in so v redu. IsError( Index( output, 2 ) )
vrne false in IsError( Index( output, 2 ).Value )
vrne true.
Če do napake pride pri filtriranju tabele, je napaka celoten zapis, vendar se kljub temu vrne v rezultatu, da uporabnik ve, da se je nekaj zgodilo in je prišlo do težave.
Oglejmo si ta primer. Izvirna tabela v tem primeru nima napak, vendar dejanje filtriranja ustvari napako vsakič, ko je Value (Vrednost) enaka 0:
Filter pravilno izvzame vrednosti –5 in –3. Vrednosti 0 pa med obdelavo filtra vrnejo napako, tako da ni jasno, ali mora biti zapis vključen v rezultat ali ne. Da bi končnim uporabnikom omogočili čim večjo preglednost in ustvarjalcem pomagali pri odpravljanju napak, v izvirnik vključimo zapis napake. Formula IsError( Index( output, 2 ) )
v tem primeru vrne vrednost »true«.
Napake vira podatkov
Funkcije, ki spreminjajo podatke v virih podatkov, kot so Patch, Collect, Remove, RemoveIf, Update, UpdateIf in SubmitForm o napakah poročajo na dva načina:
- Vsaka od teh funkcij bo kot rezultat operacije vrnila vrednost napake. Napake je mogoče zaznati s funkcijo IsError in jih, tako kot ponavadi, nadomestiti ali prekiniti z IfError in App.OnError.
- Po operaciji bo funkcija Errors vrnila tudi napake za prejšnje operacije. To je lahko uporabno pri prikazu sporočila o napaki na zaslonu obrazca brez potrebe po zajemu napake v spremenljivki stanja.
Ta formula bo na primer preverila, ali je v funkciji Collect prisotna napaka, in prikazala bo sporočilo o napaki po meri:
IfError( Collect( Names, { Name: "duplicate" } ),
Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )
Funkcija Errors prav tako vrne informacije o preteklih napakah med postopki izvajanja. Z njo je mogoče prikazati napako na zaslonu obrazca brez potrebe po zajemu napake v spremenljivki stanja.
Vnovična priklic napak
Nekatere potencialne napake so včasih pričakovane in jih lahko varno prezremo. Če je v funkciji IfError ali rutini za obravnavo App.OnError zaznana napaka, ki mora biti posredovana naslednji rutini za obravnavo na višji ravni, jo lahko ponovno prikličete s funkcijo Error( AllErrors )
.
Ustvarjanje lastnih napak
S funkcijo Error lahko ustvarite tudi lastne napake.
Če nameravate sami ustvariti napake, je priporočeno, da uporabite vrednosti, večje od 1000, da se izognete morebitnim sporom s prihodnjimi vrednostmi sistemskih napak.
Vrednosti oštevilčenja ErrorKind
Oštevilčenje ErrorKind | Vrednost | Description |
---|---|---|
AnalysisError | 18 | Sistemska napaka. Prišlo je do težave pri analizi sestavljalnika. |
BadLanguageCode | 14 | Uporabljena je bila neveljavna ali neprepoznana jezikovna koda. |
BadRegex | 15 | Neveljaven regularni izraz. Preverite sintakso, uporabljeno za funkcije IsMatch, Match ali MatchAll. |
Spor | 6 | Zapis, ki se posodablja, je bil spremenjen že v svojem viru in spor je treba razrešiti. To običajno razrešimo tako, da shranimo vse lokalne spremembe, osvežimo zapis in nato spremembe znova uporabimo. |
ConstraintViolated | 8 | Zapis ni prestal preverjanja omejitev na strežniku. |
CreatePermission | 3 | Uporabnik nima dovoljenja za ustvarjanje zapisov v tem viru podatkov. Na primer, klicana je bila funkcija Collect. |
DeletePermissions | 5 | Uporabnik nima dovoljenja za brisanje zapisov v tem viru podatkov. Na primer, klicana je bila funkcija Remove. |
Div0 | 13 | Deljenje z nič. |
EditPermissions | 4 | Uporabnik nima dovoljenja za ustvarjanje zapisov v tem viru podatkov. Na primer, klicana je bila funkcija Patch. |
GeneratedValue | 9 | Strežniku je bila pomotoma posredovana vrednost za polje, ki jo strežnik samodejno izračuna. |
InvalidFunctionUsage | 16 | Neveljavna uporaba funkcije. Pogosto je eden ali več argumentov funkcije nepravilnih ali se uporabijo na neveljaven način. |
FileNotFound | 17 | Nin bilo mogoče najti prostora za shranjevanje SaveData. |
InsufficientMemory | 21 | V napravi ni dovolj pomnilnika ali prostora za shranjevanje za to operacijo. |
InvalidArgument | 25 | Funkciji je bil posredovan neveljaven argument. |
Notranji | 26 | Sistemska napaka. Prišlo je do notranje težave z eno od funkcij. |
MissingRequired | 2 | Manjka obvezno polje zapisa. |
Omrežje | 23 | Prišlo je do težave v omrežni komunikaciji. |
Ni priprav ali omejitev | 0 | Sistemska napaka. Ni napake. |
Ni veljavno | 27 | Na voljo ni nobena vrednost. Uporabno je za razlikovanje prazne vrednosti blank, ki se lahko v numeričnih izračunih obravnava kot vrednost nič, od praznih vrednosti, ki bi morale biti ob uporabi te vrednosti označene kot potencialna težava. |
NotFound | 7 | Zapisa ni bilo mogoče najti. Na primer, za zapis, ki mora biti spremenjen v funkciji Patch. |
NotSupported | 20 | Predvajalnik ali naprava ne podpira postopka. |
Številsko | 24 | Številska funkcija je bila uporabljena na neustrezen način. Uporabljena je bila na primer funkcija Sqrt z vrednostjo –1. |
QuoteExceeded | 22 | Kvota shrambe je presežena. |
ReadOnlyValue | 10 | Stolpec je samo za branje in ga ni mogoče spreminjati. |
ReadPermission | 19 | Uporabnik nima dovoljenja za branje zapisov v tem viru podatkov. |
Sinhroniziranje | 1 | Vir podatkov je sporočil napako. Preverite stolpec »Sporočila« za več informacij. |
Neznano | 12 | Prišlo je do napake, toda vrsta je neznana. |
Preverjanje veljavnosti | 11 | Zapis ni prestal preverjanja veljavnosti. |