Dijeli putem


Rukovanje pogreškama

Ponašanje opisano u ovom članku dostupno je samo kada je uključena funkcija upravljanja pogreškama na razini formule .

Power Fx podržava rukovanje pogreškama na razini formula. Ova je značajka po defaultu uključena za sve nove aplikacije. Međutim, neke starije aplikacije možda ga imaju isključenim u postavkama aplikacije. Drži ovu funkciju uključenom.

  1. Otvorite Canvas aplikaciju u načinu uređivanja.
  2. Idi na karticu Postavke>ažuriranja>Povučeno .
  3. Provjerite je li isključeno isključivanje upravljanja na razini formula.

Za više informacija, pogledajte Kontrola koje su značajke omogućene.

Pogreške se događaju. Mreže padaju, pohrana se puni, neočekivane vrijednosti pristižu. Važno je da vaša logika nastavi ispravno funkcionirati usprkos mogućim problemima.

Prema zadanim postavkama, pogreške prolaze kroz formule aplikacije i prijavljuju se krajnjem korisniku aplikacije. Na taj način krajnji korisnik zna da se dogodilo nešto neočekivano. Mogu potencijalno sami riješiti problem drugim ulazom ili mogu prijaviti problem vlasniku aplikacije.

Kao tvorac aplikacija, preuzmite kontrolu nad greškama u svojoj aplikaciji:

  • Otkrijte i riješite pogrešku. Ako postoji mogućnost da dođe do pogreške, napišite formule aplikacije za otkrivanje stanja pogreške i pokušajte ponovno izvršiti operaciju. Krajnji korisnik ne treba brinuti o tome da je došlo do pogreške jer je kreator tu mogućnost uzeo u obzir. Zabilježite pogrešku korištenjem funkcija IfError, IsError i IsErrorOrBlank unutar formule.
  • Prijavite pogrešku. Ako se greška ne obradi u formuli u kojoj ste je zaživjeli, greška se pojavljuje u mjehuriću App.OnError handlera. Ne možete zamijeniti pogrešku jer se već dogodila i dio je izračuna formule. Ali možete upotrijebiti App.OnError za kontrolu načina na koji se pogreška prijavljuje krajnjem korisniku, uključujući potpuno suzbijanje prijave pogreške. App.OnError također pruža uobičajenu zagušljivu točku za izvješćivanje o pogreškama u cijeloj aplikaciji.
  • Kreiraj i ponovno baci grešku. Na kraju, možda ćete detektirati uvjet pogreške vlastitom logikom, uvjet specifičan za vašu aplikaciju. Upotrijebite funkciju Error da biste stvorili prilagođene pogreške. Koristite funkciju Error za ponovno izbacivanje pogreške nakon ispitivanja u IfError ili App.OnError.

Početak rada

Počnimo s jednostavnim primjerom.

  1. Kreirajte novi ekran u Power Apps Canvas aplikaciji.
  2. Umetnite kontrolu Unos teksta. Po defaultu se zove TextInput1.
  3. Umetnite kontrolu Oznaka.
  4. Postavite svojstvo Tekst ove kontrole Oznaka na formulu
1/Value( TextInput1.Text )

Snimka zaslona s oznakom pogreške prikazana s natpisom 'vrijednost se ne može pretvoriti u broj' za kontrolu unosa teksta koja sadrži 'Unos teksta'.

Vidite pogrešku jer je zadani tekst TextInput kontrole , "Text input"što se ne može pretvoriti u broj. Po defaultu je to dobra stvar: krajnji korisnik dobiva obavijest da nešto u aplikaciji ne radi kako treba.

Naravno, ne želite da se greška pojavi svaki put kad korisnik pokrene ovu aplikaciju. Vjerojatno "Text input" ionako nije prava zadana postavka za okvir za unos teksta. Da biste riješili ovaj problem, promijenite svojstvo Default kontrole TextInput na:

Blank()

Prikazana je snimka zaslona s greškom s natpisom 'dijeljenje s nulom'.

Hmm, sad vidiš drugačiju pogrešku. Matematičke operacije s praznim, poput dijeljenja, prisiljavaju praznu vrijednost na nulu. Ta vrijednost uzrokuje pogrešku dijeljenja s nulom. Da biste riješili ovaj problem, morate odlučiti koje je prikladno ponašanje za ovu situaciju u ovoj aplikaciji. Odgovor bi mogao biti prikazati prazno kada je unos teksta prazan. Ovaj cilj možete ostvariti tako da formulu omotate funkcijom IfError :

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

Snimka zaslona koja pokazuje da nije prikazan banner s greškom, pogreška zbog prazne vrijednosti zamijenjena je prazninom.

Sada se greška zamjenjuje valjanom vrijednošću i banner s greškom nestaje. Ali, možda ste prešli, IfError koji ste koristili pokriva sve pogreške, uključujući i unos loše vrijednosti poput "hello". Ovaj problem možete riješiti tako da podesite svoj IfError da obrađuje samo slučajeve dijeljenja s nulom i ponovno bacite sve ostale pogreške:

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

Prikazuje se snimka zaslona bez prikazanog bannera s greškom, pogreška uzrokovana dijeljenjem s nulom zamijenjena je praznim, u suprotnom se pogreška ponovno baca.

Dakle, pokrenite aplikaciju i isprobajte različite vrijednosti.

Bez ikakve vrijednosti, jer kada se aplikacija pokrene, nema prikazanog odgovora jer je zadana vrijednost prazno, ali također nema prikazane pogreške kao IfError koja zamjenjuje dijeljenje pogreškom nula.

Snimka zaslona koja pokazuje da nema odgovora i nema bannera s greškom.

Ako upišete 4, dobit ćete očekivani rezultat od 0,25:

Prikazana je snimka zaslona 0.25 i nema bannera s greškom.

A ako upišete nešto ilegalno, poput hello, dobit ćete banner s greškom:

Snimka zaslona koja prikazuje da nema prikazane vrijednosti i prikazan je banner s greškom zbog nemogućnosti pretvaranja 'hello' u broj.

Ovo je jednostavan uvodni primjer. Pogreške možete rješavati na mnogo različitih načina, ovisno o potrebama aplikacije:

  1. Umjesto bannera s greškom, mogli biste prikazati "#Error" u kontroli oznake s formulom. Da biste održali kompatibilnost tipova zamjena s prvim argumentom za IfError, morate eksplicitno pretvoriti numerički rezultat u tekstualni niz koristeći funkciju Text .
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Snimka zaslona prikazuje banner bez greške, već #Error kao rezultat.
  2. Umjesto da ovu specifičnu instancu obavijete IfErrorom, mogli biste napisati centralizirani App.OnError handler. Ne možete zamijeniti prikazani string s "#Error" jer se greška već dogodila, a App.OnError je dostupan samo za kontrolno izvještavanje.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Proslijeđivanje podataka

Pogreške teku kroz formule slično kao u Excelu. Na primjer, u Excelu, ako ćelija A1 ima formulu =1/0, tada A1 prikazuje vrijednost #DIV0!pogreške :

Snimka zaslona Excel tablice s A1=1/0 i #DIV/0! prikazano u ćeliji.

Ako se ćelija A2 referira A1 na s formulom poput =A1*2, pogreška se također širi kroz tu formulu:

Snimka zaslona Excel tablice s A2=A1*2 i #DIV/0! prikazano u ćeliji.

Pogreška zamjenjuje vrijednost koju bi formula inače izračunala. Nema rezultata za množenje u ćeliji A2, samo pogreška kod dijeljenja u A1.

Power Fx radi na isti način. Općenito, ako unesete pogrešku kao argument funkciji ili operatoru, operacija se ne izvršava. Ulazna pogreška prolazi kao rezultat operacije. Na primjer, Mid( Text( 1/0 ), 1, 1 ) vraća grešku dijeljenja s nulom, jer najunutarnja pogreška prolazi kroz funkciju Text i Mid funkciju:

Snimka zaslona trake s greškom koja prikazuje nevažeću operaciju: dijeljenje s nulom.

Općenito, pogreške ne prolaze kroz svojstva kontrole Power Apps-a. Proširimo prethodni primjer s drugom kontrolom koja prikazuje je li svojstvo prve oznake Text stanje pogreške:

Snimka zaslona koja pokazuje da nema greške na drugoj kontroli naljepnica.

U redu je da se pogreške ne šire kroz kontrolu jer sustav promatra pogreške na ulazu u sva svojstva kontrole. Pogreška nije izgubljena.

Većina funkcija i operatora slijedi pravilo "error in, error out", ali postoje neke iznimke. Funkcije IsError, IsErrorOrBlank i IfError dizajnirane su za rad s pogreškama, pa možda neće vratiti pogrešku čak i ako im se ona prenese.

Uočavanje pogrešaka

Power Fx ne primjećuje pogreške dok formula ne koristi vrijednost pogreške.

Kao rezultat toga, funkcije If i Select možda neće vratiti pogrešku ako se jedna proslijedi. Razmotrite formulu If( false, 1/0, 3 ). U ovoj formuli postoji pogreška dijeljenja s nulom, ali budući da funkcija If ne prima tu granu zbog uvjeta false, Power Fx i Power Apps ne prijavljuju pogrešku:

Prikazana je snimka zaslona bez greške, s funkcijom If u svojstvu oznake Tekst.

Korištenje funkcije Set s greškom ne prijavljuje grešku u trenutku kada je pogreška smještena u varijablu. Na primjer, u Power Apps, evo formule u App.OnStart koja smješta pogrešku dijeljenja s nulom u varijablu x:

Prikazan je screenshot bez bannera s greškom s pozivom funkcije Set u App.OnStart.

Nije prijavljena nikakva pogreška jer x nije referenciran. Međutim, u trenutku kada dodate oznaku i postavite njezino svojstvo Tekst na x, prikazuje se greška:

Prikazan je screenshot bannera s greškom s oznakom koja referencira varijablu x.

Pogreške unutar formule možete promatrati koristeći funkcije IfError, IsError i IsErrorOrBlank . Korištenjem ovih funkcija možete vratiti alternativnu vrijednost, poduzeti alternativnu radnju ili izmijeniti pogrešku prije nego što se primijeti i prijavi.

Prijava pogrešaka

Nakon što Power Fx uoči grešku, sljedeći korak je prijaviti grešku krajnjem korisniku.

Za razliku od Excela, ne postoji uvijek prikladno mjesto za prikaz rezultata pogreške, jer rezultat formule može pokretati svojstvo poput X i Y koordinata kontrole za koju nema prikladnog mjesta za prikaz teksta. Svaki Power Fx domaćin kontrolira kako se pogreške u konačnici prikazuju krajnjem korisniku i koliko kontrole kreator ima nad tim procesom. U Power Apps. prikazuje se banner s pogreškom, a App.OnError se koristi za kontrolu načina na koji se greška prijavljuje.

Važno je napomenuti da App.OnError ne može zamijeniti pogrešku na isti način na koji IfError može. U trenutku izvršavanja App.OnError , greška se već dogodila, a rezultat se prenosi kroz druge formule. App.OnError samo kontrolira način na koji se pogreška prijavljuje krajnjem korisniku i pruža udicu za izradu da zabilježi pogrešku ako želi.

Varijable opsega FirstError i AllErrors daju informacije o kontekstu o pogrešci ili pogreškama. Ovaj kontekst pruža informacije o vrsti pogreške, gdje je pogreška nastala i gdje je opažena.

Zaustavljanje nakon pogreške

Formule ponašanja podržavaju poduzimanje radnji, modificiranje baza podataka i promjenu stanja. Ove formule omogućuju izvođenje više od jedne radnje u nizu koristeći ; operator lančanja (ili ;; , ovisno o lokaciji).

U ovom slučaju, na primjer, kontrola mreže pokazuje što se nalazi u tablici T . Svaki odabir gumba mijenja stanje u ovoj tablici s dva Patch poziva:

Snimka zaslona animacije koja prikazuje da se dva zapisa u tablici T ažuriraju nasumičnim brojevima nakon svakog klika na gumb.

U formuli lančanog ponašanja, akcije ne prestaju nakon prve pogreške. Modificirajmo naš primjer da proslijedi nevažeći broj indeksa u prvom Patch pozivu. Druga vrijednost Patch nastavlja unatoč ovoj ranijoj pogrešci. Prva se pogreška prijavljuje krajnjem korisniku i prikazuje se kao pogreška u Studiju na kontroli:

Snimka zaslona animacije koja prikazuje da se samo drugi zapis u tablici T ažurira nasumičnim brojevima nakon svakog klika na gumb, pri čemu prvi zapis rezultira pogreškom.

Koristite IfError za zaustavljanje izvršavanja nakon pogreške. Slično funkciji If , treći argument ove funkcije pruža mjesto za postavljanje radnji koje bi se trebale izvršiti samo ako nema pogreške:

Snimka zaslona animacije koja ne prikazuje promjene ni na jednom zapisu u tablici T, jer IfError sprječava dovršetak druge operacije nakon pogreške.

Ako se tijekom jedne od iteracija ForAlla pojavi greška, ostale iteracije ne prestaju. ForAll je dizajniran za izvršavanje svake iteracije neovisno, omogućujući paralelno izvršavanje. Kada je ForAll dovršen, vraća se pogreška koja sadrži sve naiđene pogreške (pregledom AllErrors u IfError ili App.OnError).

Na primjer, sljedeća formula rezultira time da ForAll vraća dvije pogreške (za dijeljenje s nulom za Value 0, dvaput) i ima tri zapisa Collection (za kada Value nije 0): [1, 2, 3].

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

Rad s više pogrešaka

Budući da formula ponašanja može izvršiti više od jedne akcije, također može naići na više od jedne pogreške.

Po defaultu, aplikacija prijavljuje prvu grešku krajnjem korisniku. U ovom primjeru, oba Patch poziva ne uspijevaju, ali drugi poziv ne uspijeva s pogreškom dijeljenja nula. Korisnik vidi samo prvu pogrešku o indeksu:

Snimka zaslona prve pogreške indeksa prikazana je u banneru za grešku, druga pogreška nije prijavljena.

Funkcija IfError i App.OnError mogu pristupiti svim greškama na koje se naiđe koristeći varijablu opsega AllErrors . U tom slučaju možete postaviti ovu varijablu na globalnu varijablu i pogledati obje greške na koje naiđete. Pojavljuju se u tablici istim redoslijedom kojim su otkrivene:

Snimka zaslona hvatanja pogrešaka u globalnu varijablu PatchErrors gdje možemo vidjeti da su obje pogreške prisutne.

Nebihevioralne formule također mogu vratiti više pogrešaka. Na primjer, korištenje Patch funkcije sa serijom zapisa za ažuriranje može vratiti više pogrešaka, jednu za svaki zapis koji ne uspije.

Pogreške u tablicama

Kao što ste ranije vidjeli, pogreške možete pohraniti u varijable. Također možete uključiti pogreške u strukturama podataka, poput tablica. Ovaj pristup je važan jer osigurava da pogreška na bilo kojem zapisu ne može poništiti cijelu tablicu.

Na primjer, razmotrite ovu kontrolu podatkovne tablice u Power Apps-u:

Snimka zaslona tablice podataka koja prikazuje pogrešku polja Recipročno za ulaz 0, što rezultira pogreškom dijeljenja s nulom.

Izračun u AddColumns naišao je na pogrešku dijeljenja s nulom za jednu od vrijednosti. Za taj jedan zapis, stupac Reciprocal ima vrijednost pogreške (dijeljenje s nulom), ali ostali zapisi nemaju i u redu su. IsError( Index( output, 2 ) ) Vraća false i IsError( Index( output, 2 ).Value ) vraća true.

Ako dođe do pogreške prilikom filtriranja tablice, cijeli zapis je greška. Operacija i dalje vraća zapis u rezultatu tako da krajnji korisnik zna da je nešto bilo tamo i da postoji problem.

Pogledajmo ovaj primjer. Ovdje izvorna tablica nema pogrešaka, ali čin filtriranja stvara pogrešku kad god je Vrijednost jednaka 0:

Snimka zaslona tablice podataka koja prikazuje pogreške za dva zapisa koja nisu mogla biti obrađena kriterijima filtra.

Vrijednosti -5 i -3 ispravno su filtrirane. Vrijednosti 0 rezultiraju pogreškom u obradi filtra, pa je nejasno treba li zapis biti uključen u rezultat ili ne. Kako bi se maksimizirala transparentnost za krajnje korisnike i pomoglo proizvođačima u otklanjanju pogrešaka, operacija uključuje zapis pogrešaka umjesto originalnog. U ovom slučaju, IsError( Index( output, 2 ) ) vraća true.

Pogreške izvora podataka

Funkcije koje mijenjaju podatke u izvorima podataka, kao što su Patch, Collect, Remove, RemoveIf, Update, UpdateIf i SubmitForm prijavljuju pogreške na dva načina:

  • Svaka od tih funkcija vraća vrijednost pogreške kao rezultat operacije. Možete otkriti pogreške koristeći IsError , a zamijeniti ili suzbiti pogreške koristeći IfError i App.OnError kao i obično.
  • Nakon operacije, funkcija Pogreške također vraća pogreške za prethodne operacije. Ovo ponašanje može biti korisno za prikaz poruke o pogrešci na ekranu obrasca bez potrebe za hvatanjem pogreške u varijabli stanja.

Na primjer, ova formula provjerava pogrešku iz Collect i prikazuje prilagođenu poruku o pogrešci:

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

Funkcija Errors također vraća informacije o prošlim pogreškama tijekom operacija izvođenja. Ovo može biti korisno za prikaz poruke o pogrešci na zaslonu obrasca bez potrebe za bilježenjem pogreške u varijabli stanja.

Vraćanje pogrešaka

Ponekad očekujete potencijalne pogreške i možete ih sigurno ignorirati. Unutar IfError i App.OnError, ako se otkrije greška koju treba proslijediti sljedećem višem rukovatelju, ponovno je bacite koristeći .Error( AllErrors )

Stvaranje vlastitih pogrešaka

Također možete kreirati vlastite pogreške koristeći funkciju Error .

Ako sami stvarate pogreške, koristite vrijednosti veće od 1.000 kako biste izbjegli potencijalne sukobe s budućim sustavnim pogreškama.

Enumeracijske vrijednosti ErrorKind

Izvid ErrorKind Vrijednost Opis
AnalysisError 18 Pogreška sustava. Postoji problem s analizom kompajlera.
BadLanguageCode 14 Upotrijebljen je nevažeći ili neprepoznati jezični kôd.
BadRegex 15 Uobičajeni izraz nije valjan. Provjerite sintaksu koja se koristi s funkcijama IsMatch, Match ili MatchAll.
Sukob 6 Zapis koji ažurirate već je promijenjen na izvoru i morate riješiti sukob. Uobičajeno rješenje je spremiti sve lokalne promjene, osvježiti zapis i ponovno primijeniti promjene.
ConstraintViolated 8 Zapis nije prošao provjeru ograničenja na poslužitelju.
CreatePermission 3 Nemate dozvolu za stvaranje zapisa za izvor podataka. Na primjer, pozvana je funkcija Collect .
DeletePermissions 5 Nemate dopuštenje za brisanje zapisa za izvor podataka. Na primjer, pozvana je funkcija Remove .
Div0 13 Dijeljenje nulom.
EditPermissions 4 Nemate dozvolu za stvaranje zapisa za izvor podataka. Na primjer, pozvana je funkcija Patch .
GeneratedValue 9 Vrijednost je pogrešno proslijeđena serveru za polje koje server automatski izračunava.
InvalidFunctionUsage 16 Iskorištenost funkcije nije valjana. Često je jedan ili više argumenata funkcije netočan ili se koristi na nevažeći način.
FileNotFound 17 Pohranu SaveData nije bilo moguće pronaći.
InsufficientMemory 21 Na uređaju nema dovoljno memorije ili prostora za tu operaciju.
InvalidArgument 25 Nevaljani argument prešao je u funkciju.
Interni 26 Pogreška sustava. Postoji unutarnji problem s jednom od funkcija.
MissingRequired 2 Nedostaje obavezno polje zapisa.
Mreža 23 Postoji problem s mrežnom komunikacijom.
Nijedno 0 Pogreška sustava. Nema pogreške.
Ne može se primijeniti 27 Nijedna vrijednost nije dostupna. Ova pogreška korisna je za razlikovanje prazne vrijednosti koja se može tretirati kao nula u numeričkim izračunima od praznih vrijednosti koje bi trebale biti označene kao potencijalni problem ako se ta vrijednost koristi.
NotFound 7 Zapis se nije mogao pronaći. Na primjer, zapis koji treba izmijeniti u funkciji Patch.
NotSupported 20 Ovaj reproduktor ili uređaj ne podržava operaciju.
Brojčano 24 Numerička funkcija korištena je na neprikladan način. Na primjer, Sqrt sa -1.
QuoteExceeded 22 Premašena je kvota pohrane.
ReadOnlyValue 1,0 Stupac je samo za čitanje i ne može se mijenjati.
ReadPermission 19 Nemate dopuštenje za čitanje zapisa za izvor podataka.
Sinkroniziraj 1 Izvor podataka prijavio je pogrešku. Dodatne informacije potražite u stupcu Poruka.
Nepoznato 12 Došlo je do pogreške, ali nepoznate vrste.
Provjera valjanosti 11 Zapis nije prošao provjeru valjanosti.