Deli putem


Rukovanje greškama

Belešku

Ponašanje koje ovaj članak opisuje dostupno je samo kada je uključena probna funkcija Upravljanje greškama na nivou formule u meniju Postavke>Predstojeće funkcije>Pregled. Još informacija: Kontrolisanje koje funkcije su omogućene

Greške se dešavaju. Mreže padaju, skladište se popunjava, ulaze neočekivane vrednosti. Važno je da vaša logika nastavi da radi kako treba suočena sa potencijalnim problemima.

Greške podrazumevano prolaze kroz formule aplikacije i prijavljuju se krajnjem korisniku aplikacije. Na taj način krajnji korisnik zna da se nešto neočekivano dogodilo, on potencijalno može sam da reši problem drugim unosom ili može da prijavi problem vlasniku aplikacije.

Kao autor aplikacije, možete da preuzmete kontrolu nad greškama u aplikaciji:

  • Otkrivanje greške i rukovanje njome. Ako postoji šansa da dođe do greške, formule aplikacije mogu biti napisane tako da otkriju stanje greške i ponovo pokušaju operaciju. Krajnji korisnik ne mora da bude zabrinut da je došlo do greške jer je autor uzeo u obzir tu mogućnost. Ovo se radi sa funkcijama IfError, IsError i IsErrorOrBlank u okviru formule.
  • Prijavljivanje greške. Ako se greškom ne rukuje u formuli tamo gde se na nju naišlo, greška se zatim izbija u rukovaocu App.OnError. Ovde se greška više ne može zameniti jer se već pojavila i deo je izračunavanja formula. Međutim, aplikaciju App.OnError možete da koristite da biste kontrolisali kako se greška prijavljuje krajnjem korisniku, uključujući i sveukupno suzbijanje izveštavanja o greškama. App.OnError takođe pruža zajedničku tačku gušenja za izveštavanje o greškama u celoj aplikaciji.
  • Kreiranje i ponovno prepoznavanje greške. Na kraju, možete da otkrijete stanje greške sopstvenom logikom, stanje koje je specifično za vašu aplikaciju. Koristite funkciju Error da biste kreirali i prijavili prilagođene greške. Funkcija Error se takođe koristi za ponovno prepoznavanje greške nakon ispitivanja u IfError ili App.OnError.

Prvi koraci

Počnimo sa jednostavnim primerom.

  1. Kreirajte novi ekran u Power Apps aplikaciji sa podlogom.
  2. Unesite kontrolu TextInput. Podrazumevano će to biti ime TextInput1.
  3. Umetnite kontrolu Label.
  4. Podesite svojstvo Text kontrole Label na formulu
1/Value( TextInput1.Text )

Baner greške prikazan sa

Imamo grešku zato što je podrazumevani tekst kontrole TextInput "Text input" koji se ne može konvertovati u broj. Ovo je podrazumevano dobra stvar: krajnji korisnik će dobiti obaveštenje da nešto ne funkcioniše na očekivani način u aplikaciji.

Očigledno, ne želimo da pozdravimo korisnika greškom svaki put kada pokrene ovu aplikaciju. Verovatno "Text input" ionako nije podrazumevana vrednost za okvir za unos teksta. Da bismo to rešili, promenimo svojstvo Default kontrole TextInput u:

Blank()

Greška baner prikazan sa

Uh, sada imamo drugu grešku. Matematičke operacije sa praznom vrednošću, kao što je deljenje, preinačiće praznu vrednost na nulu. A to sada izaziva grešku zbog deljenja nulom. Da bismo ovo otklonili, moramo da odlučimo koje je prikladno ponašanje za ovu situaciju u ovoj aplikaciji. Odgovor može biti da se prikaže prazno kada je unos teksta prazan. To možemo da postignemo tako što ćemo formulu umotati funkcijom IfError:

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

Ne greška baner prikazan, greška zbog prazne vrednosti je zamenjen sa praznim

Sada se greška zamenjuje važećom vrednošću i baner greške je nestao. Ali, možda smo preterali, IfError koji smo koristili pokriva sve greške, uključujući i kucanje loše vrednosti kao što je "hello". Ovo možemo rešiti podešavanjem našeg funkcije IfError da rukuje deljenjem nulom samo sa i ponovnom rešavanjem svih ostalih grešaka:

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

No error banner prikazan, greška zbog posebno podele sa nulom je zamenjen praznim, u suprotnom greška je ponovo bačen

Zato, hajde da pokrenemo našu aplikaciju i probamo neke drugačije vrednosti.

Bez ikakve vrednosti, kao kada se aplikacija pokrene, ne postoji prikazan odgovor jer je podrazumevana vrednost prazna, ali takođe nema prikazane greške jer IfError zamenjuje grešku deljenja nulom.

Nema odgovora prikazan i nema banera greške

Ako ukucamo 4, dobijamo očekivani rezultat od 0,25:

0.25 prikazan i nema baner greške

A ako ukucamo nešto neispravno, kao što je hello, tada ćemo dobiti baner greške:

Nema prikazana vrednost i baner greška prikazan za nemogućnost da se pretvori

Ovo je jednostavan uvodni primer. Rukovanje greškama može da se uradi na više različitih načina, u zavisnosti od potreba aplikacije:

  1. Umesto banera greške, mogli smo da prikažemo „#Error“ u kontroli oznake sa formulom. Da bi tipovi zamena ostali kompatibilni sa prvim argumentom funkcije IfError, potrebno je da izričito konvertujemo numerički rezultat u tekstualnu nisku funkcijom Text.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Nema baner greške i umesto toga #Error je prikazan kao rezultat
  2. Umesto da umotamo ovu konkretnu instancu funkcijom IfError, mogli smo da napišemo centralizovani rukovalac App.OnError. Ne možemo da zamenimo nisku prikazanu sa „#Error“ jer se greška već dogodila, a App.OnError obezbeđuje samo kontrolu izveštavanja.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Prenošenje greške

Greške prolaze kroz formule isto kao i u programu Excel. Na primer, u programu Excel, ako ćelija A1 ima formulu =1/0, A1 će prikazati vrednost greške #DIV0!:

Ekcel tabela sa AKSNUMKS = KSNUMKS / KSNUMKS i #DIV / KSNUMKS! prikazan u ćeliji

Ako se ćelija A2 odnosi na A1 formulom kao što je =A1*2, greška se takođe prenosi kroz tu formulu:

Ekcel tabela sa A2 = A1 * 2 i #DIV / 0! prikazan u ćeliji

Greška zamenjuje vrednost koja bi inače bila izračunata. Nema rezultata množenja u ćeliji A2, već samo greške iz deljenja u A1.

Power Fx funkcioniše na isti način. Uopšte, ako je greška navedena kao argument funkcije ili operatora, operacija se neće izvršiti i ulazna greška će proći kao rezultat operacije. Na primer, Mid( Text( 1/0 ), 1, 1 ) vraća grešku „Deljenje nulom“, jer krajnja unutrašnja greška prolazi kroz funkciju Text i funkciju Mid:

Baner greške koji prikazuje nevažeću operaciju: podela sa nulom

Uopšte, greške ne prolaze kroz svojstva Power Apps kontrola. Proširimo prethodni primer dodatnom kontrolom koja prikazuje da li je svojstvo prve oznake Text stanje greške:

Nema greške prikazane na drugoj kontroli nalepnice

U redu je što se greške ne prenose kroz kontrolu, jer će sistem primetiti greške na unosu u sva svojstva kontrole. Greška neće biti izgubljena.

Većina funkcija i operatora sledi pravilo „greška ulazi, greška izlazi“, ali postoje neki izuzeci. Funkcije IsError, IsErrorOrBlank i IfError su osmišljene za rad sa greškama, tako da možda neće vratiti grešku čak i ako se ona prosledi u njih.

Uočavanje grešaka

Greške se ne primećuju dok se njihova vrednost ne iskoristi.

Kao rezultat toga, funkcije If i Select takođe ne mogu da vrate grešku ako se prosledi. Razmotrite formulu If( false, 1/0, 3 ). U ovoj formuli je prisutna podela nulom, ali pošto If ne uzima tu granu jer je false, Power Fx i Power Apps neće prijaviti grešku:

Nema banera greške prikazanog sa funkcijom Ako u osobini oznake Tekst

Korišćenje funkcije Set sa greškom neće prijaviti grešku u trenutku kada se greška smesti u promenljivu. Na primer, u usluzi Power Apps, evo formule u rukovaocu App.OnStart koja postavlja grešku deljenja nulom u promenljivu x:

Nema banera greške prikazanog sa pozivom Set funkcije u App.OnStart

Greška se ne prijavljuje jer x ne upućuje na to. Međutim, onog trenutka kada dodamo kontrolu oznake i postavimo njeno svojstvo Text na x, greška se prikazuje:

Baner greške prikazan sa kontrolom oznake koja upućuje na promenljivu k

Greške možete uočiti formulama koje koriste funkcije IfError, IsError i IsErrorOrBlank. Pomoću ovih funkcija možete da vratite alternativnu vrednost, preduzmete alternativnu radnju ili izmenite grešku pre nego što se ona uoči i prijavi.

Izveštavanje o greškama

Kada se greška uoči, sledeći korak je da prijavite grešku krajnjem korisniku.

Za razliku od programa Excel, ne postoji uvek zgodno mesto za prikazivanje rezultata greške, jer rezultat formule može da utiče na svojstvo kao što su koordinate X i Y kontrole za koju ne postoji pogodno mesto za prikazivanje teksta. Svaki Power Fx host kontroliše kako se greške na kraju prikazuju krajnjem korisniku i koliko kontrole autor ima nad ovim procesom. U Power Apps programu se prikazuje baner greške i rukovalac App.OnError se koristi za kontrolisanje načina na koji se greška prijavljuje.

Važno je napomenuti da App.OnError ne može da zameni grešku na isti način kao što može IfError. U trenutku kada se izvršava App.OnError, greška se već dogodila, a rezultat se preneo kroz druge formule. App.OnError samo kontroliše kako se greška prijavljuje krajnjem korisniku i obezbeđuje kuku za proizvođača da prijavi grešku ako želi.

Promenljive opsega FirstError i AllErrors pružaju kontekstualne informacije o grešci ili greškama. To pruža informacije o vrsti greške i o tome odakle je greška potiče i gde je primećena.

Zaustavljanje nakon greške

Formule za ponašanje podržavaju preduzimanje radnji, menjanje baza podataka i promenu statusa. Ove formule omogućavaju obavljanje više radnji u nizu pomoću operatora za ulančavanje ; (ili ;;, u zavisnosti od lokalnog standarda).

U ovom slučaju, na primer, kontrola mreže prikazuje šta se nalazi u tabeli T. Svaki izbor dugmeta menja stanje u ovoj tabeli sa dva poziva funkcije patch:

Animacija koja prikazuje dva zapisa u tabeli T koja se ažurira slučajnim brojevima nakon svakog klika na dugme

U lančanoj formuli ponašanja, radnje se ne zaustavljaju posle prve greške. Izmenimo naš primer da prosledimo nevažeći broj indeksa u prvom pozivu funkcije Patch. Druga funkcija Patch se nastavlja uprkos ovoj ranijoj grešci. Prva greška se prijavljuje krajnjem korisniku i prikazuje se kao greška u programu Studio na kontroli:

Animacija koja prikazuje samo drugi zapis u tabeli T koji se ažurira slučajnim brojevima nakon svakog klika na dugme, prvi zapis rezultira greškom

IfError se može koristiti za zaustavljanje izvršenja nakon greške. Slično funkciji If, treći argument ove funkcije obezbeđuje mesto za izvršavanje radnji koje bi trebalo izvršiti samo ako nema greške:

Animacija koja ne prikazuje promene ni u jednom zapisu u tabeli T, jer IfError sprečava drugu operaciju da se završi nakon greške

Ako se naiđe na grešku tokom jedne od iteracija petlje ForAll, ostale iteracije se neće zaustaviti. ForAll je dizajniran da izvrši svaku iteraciju nezavisno, omogućavajući paralelno izvršenje. Kada se ForAll dovrši, biće vraćena greška koja sadrži sve greške na koje je petlja naišla (ispitivanjem AllErrors u IfError ili App.OnError).

Na primer, sledeća formula će rezultirati time da ForAll vrati dve greške (za deljenje nulom za Value 0, dvaput), a Collection će imati tri zapisa (za slučajeve kada Value nije 0): [1, 2, 3].

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

Rad sa više grešaka

Pošto formula ponašanja može da izvrši više radnji, takođe može naići na više grešaka.

Krajnji korisnik se podrazumevano izveštava o prvoj grešci. U ovom primeru, oba poziva funkcije Patch neće uspeti, drugi zbog greške deljenja nulom. Korisniku se prikazuje samo prva greška (o indeksu):

Prvi indeks greška prikazan u baneru greške, druga greška nije prijavljeno

Funkcija IfError i rukovalac App.OnError mogu da pristupe svim greškama na koje je naišla promenljiva opsega AllErrors. U ovom slučaju, možemo ovo postaviti na globalnu promenljivu i sagledati obe greške na koje smo naišli. One se prikazuju u tabeli istim redosledom kojim smo nailazili na njih:

Hvatanje grešaka u globalnu promenljivu PatchErrors gde možemo videti da su obe greške prisutne

Više grešaka se može vratiti i u formulama koje ne prate ponašanje. Na primer, korišćenje funkcije Patch sa grupom zapisa za ažuriranje može da vrati više grešaka, po jednu za svaki zapis koji ne uspe.

Greške u tabelama

Kao što smo videli ranije, greške se mogu uskladištiti u promenljive. Greške se mogu uključiti i u strukture podataka kao što su tabele. To je važno zato što greška u bilo kom zapisu ne može da poništi celu tabelu.

Na primer, razmotrite ovu kontrolu tabele podataka u Power Apps aplikacijama:

Tabela podataka koja prikazuje grešku za polje Recipročni za ulaz od 0, što rezultira podelom sa nultom greškom

Izračunavanje u funkciji AddColumns je naišlo na grešku deljenja nulom za jednu od vrednosti. Za taj jedan zapis, kolona Reciprocal ima vrednost greške (deljenje nulom), ali ostali zapisi nemaju i oni su u redu. IsError( Index( output, 2 ) ) Vraća false i IsError( Index( output, 2 ).Value ) vraća true.

Ako dođe do greške prilikom filtriranja tabele, ceo zapis je greška, ali se ipak vraća u rezultatu, tako da krajnji korisnik zna da se tu nešto dogodilo i da postoji neki problem.

Uzmite ovaj primer. Ovde originalna tabela nema grešaka, ali čin filtriranja kreira grešku svaki put kada je Value jednako 0:

Tabela podataka koja prikazuje greške za dva zapisa koji nisu mogli biti obrađeni kriterijumima filtera

Vrednosti -5 i -3 su pravilno filtrirane. Vrednosti 0 rezultiraju greškom u obradi filtera i zato je nejasno da li zapis treba da bude uključen u rezultat ili ne. Da bismo povećali transparentnost za krajnje korisnike i pomogli autorima otklanjanja grešaka, uključujemo zapis greške umesto originala. U ovom slučaju, IsError( Index( output, 2 ) ) vraća true.

Greške izvora podataka

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

  • Svaka od ovih funkcija će vratiti grešku kao rezultat operacije. Greške se mogu otkriti pomoću funkcije IsError i zameniti ili potisnuti funkcijom IfError i App.OnError, kao i obično.
  • Nakon operacije, funkcija Errors će takođe vratiti greške za prethodne operacije. Ovo može biti korisno za prikazivanje poruke o grešci na ekranu obrasca bez potrebe da hvatate grešku u promenljivoj statusa.

Na primer, ova formula će proveriti da li postoji greška iz opcije Collect i prikazati prilagođenu poruku o grešci:

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

Funkcija Errors takođe vraća informacije o prethodnim greškama tokom operacija izvršavanja. To može biti korisno za prikazivanje poruke o grešci na ekranu obrasca bez potrebe da hvatate grešku u promenljivoj statusa.

Ponovno prepoznavanje grešaka

Ponekad se neke potencijalne greške očekuju i mogu se bezbedno ignorisati. Unutar funkcije IfError i rukovaoca App.OnError, ako se otkrije greška koja bi trebalo da se prosledi sledećem višem rukovaocu, ona se može ponovo otkriti formulom Error( AllErrors ).

Kreiranje sopstvenih grešaka

Takođe možete da kreirate sopstvene greške pomoću funkcije Error.

Ako kreirate sopstvene greške, preporučuje se da koristite vrednosti iznad 1000 da biste izbegli potencijalne neusaglašenosti sa budućim vrednostima sistemskih grešaka.

Vrednosti ErrorKind prebrojavanja

ErrorKind prebrojavanje Vrednost Opis
AnalysisError 18 Sistemska greška. Došlo je do problema sa analizom kompajlera.
BadLanguageCode 14 Korišćen je nevažeći ili neprepoznat kôd jezika.
BadRegex 15 Nevažeći regularni izraz. Proverite sintaksu koja se koristi sa funkcijom IsMatch, Match ili MatchAll.
Neusaglašenost 6 Zapis koji se ažurira je već promenjen na izvoru i potrebno je rešiti neusaglašenost. Uobičajeno rešenje je da sačuvate sve lokalne promene, osvežite zapis i ponovo primenite promene.
ConstraintViolated 8 Zapis nije prošao proveru ograničenja na serveru.
CreatePermission 3 Korisnik nema dozvolu za kreiranje zapisa u ovom izvoru podataka. Na primer, pozvana je funkcija Collect.
DeletePermissions 5 Korisnik nema dozvolu za brisanje zapisa u ovom izvoru podataka. Na primer, pozvana je funkcija Remove.
Div0 13 Deljenje nulom.
EditPermissions 4 Korisnik nema dozvolu za kreiranje zapisa u ovom izvoru podataka. Na primer, pozvana je funkcija Patch.
GeneratedValue 9 Vrednost je pogrešno prosleđena serveru za polje koje server automatski izračunava.
InvalidFunctionUsage 16 Nevažeća upotreba funkcije. Često je jedan ili više argumenata funkcije netačan ili se koristi na nevažeći način.
FileNotFound 17 Nije moguće pronaći skladište SaveData.
InsufficientMemory 21 Nema dovoljno memorije ili prostora za skladištenje na uređaju za operaciju.
InvalidArgument 25 Nevažeći argument je prosleđen funkciji.
Unutrašnje 26 Sistemska greška. Postojao je internog problema sa jednom od funkcija.
MissingRequired 2 Nedostajalo je potrebno polje zapisa.
Mreža 23 Došlo je do problema sa mrežnim komunikacijama.
Nijedno 0 Sistemska greška. Nema greške.
Nije primenljivo 27 Nema dostupnih vrednosti. Korisno za razlikovanje prazne vrednosti koja se može tretirati kao nula u numeričkim izračunavanjima od praznih vrednosti koje bi trebalo označiti kao potencijalni problem ako se vrednost koristi.
NotFound 7 Nije moguće pronaći zapis. Na primer, zapis koji treba izmeniti u funkciji Patch.
NotSupported 20 Ovaj plejer ili uređaj ne podržava operaciju.
Numerički 24 Numerička funkcija je korišćena na neprikladan način. Na primer, zamenite Sqrt sa -1.
QuoteExceeded 22 Premašena je kvota za skladištenje.
ReadOnlyValue 10 Kolona je samo za čitanje i ne može se menjati.
ReadPermission 19 Korisnik nema dozvolu za čitanje zapisa u ovom izvoru podataka.
Sinhronizacija 1 Greška je prijavljena od strane izvora podataka. Proverite kolonu Poruka za više informacija.
Nepoznato 12 Došlo je do greške, ali nepoznate vrste.
Provera valjanosti 11. Zapis nije prošao proveru valjanosti.