Deli z drugimi prek


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.

  1. V aplikaciji s platnom storitve Power Apps ustvarite nov zaslon.
  2. Vstavite kontrolnik TextInput. Kontrolnik bo privzeto nastavljen na ime TextInput1.
  3. Vstavite kontrolnik Label.
  4. Nastavite lastnost Text kontrolnika Label na formulo
1/Value( TextInput1.Text )

Pasica z napako, prikazana z

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()

Prikazana pasica z napako z

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() )

Ni prikazana pasica z napako, napaka zaradi prazne vrednosti je bila nadomeščena s prazno

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 ) ) )

Ni prikazana pasica z napako, napaka zaradi deljenja z ničlo je bila nadomeščena s praznim, sicer se napaka ponovno prikaže

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č.

Ni prikazanega odgovora in ni pasice z napako

Če vnesemo vrednost 4, dobimo pričakovani rezultat 0,25:

Prikazano je 0,25 in ni pasice z napako

Če pa vnesemo nedovoljeno vrednost, kot na primer hello, se bo prikazala pasica z napako:

Prikazana ni nobena vrednost in prikazana je pasica z napako zaradi nezmožnosti pretvorbe

To je preprost primer za predstavitev. Napake je mogoče obravnavati na različne načine, odvisno od potreb aplikacije:

  1. 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" )
    
    Ni pasice z napako in namesto tega je kot rezultat prikazan #Error
  2. 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!:

Excelova preglednica z A1=1/0 in #DIV/0! prikazano v celici

Č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:

Excelova preglednica z A2=A1*2 in #DIV/0! prikazano v celici

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:

Pasica z napako, ki prikazuje neveljavno operacijo: deljenje z ničlo

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:

Na drugi kontroli oznake ni prikazana nobena napaka

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:

Ni prikazane pasice z napako s funkcijo If v lastnosti besedila oznake

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č:

Ni prikazane pasice z napako s klicem funkcije Set v App.OnStart

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:

Prikazana je pasica z napako s kontrolnikom oznake, ki se sklicuje na spremenljivko 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:

Animacija, ki prikazuje dva zapisa v tabeli T, ki se posodabljata z naključnimi številkami po vsakem kliku gumba

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:

Animacija, ki prikazuje samo drugi zapis v tabeli T, ki se posodablja z naključnimi številkami po vsakem kliku gumba, pri čemer prvi zapis povzroči napako

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:

Animacija, ki ne prikazuje sprememb v nobenem zapisu v tabeli T, ker IfError preprečuje dokončanje druge operacije po napaki

Č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):

Prva napaka indeksa je prikazana v pasici z napako, druga napaka se ne poroča

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:

Zajem napak v globalno spremenljivko PatchErrors, kjer lahko vidimo, da sta prisotni obe napaki

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:

Podatkovna tabela prikazuje napako za polje Reciprocal za vnos 0, kar ima za posledico napako deljenja z nič

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:

Podatkovna tabela, ki prikazuje napake za dva zapisa, ki ju kriteriji filtra niso mogli obdelati

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.