Zdieľať cez


Spracovanie chýb

Poznámka

Správanie, ktoré popisuje tento článok, je k dispozícii len vtedy, keď je zapnutá funkcia verzie Preview Správa chýb na úrovni vzorcov prostredníctvom položky Nastavenia>Pripravované funkcie>Verzia Preview. Ďalšie informácie: Riadenie toho, funkcie sú povolené

Chyby sa stávajú. Siete padajú, úložisko sa zapĺňa, prichádzajú neočakávané hodnoty. Je dôležité, aby vaša logika naďalej správne fungovala aj napriek možným problémom.

V predvolenom nastavení prechádzajú chyby cez vzorce aplikácie a sú hlásené koncovému používateľovi aplikácie. Týmto spôsobom koncový používateľ vie, že sa stalo niečo neočakávané, môže potenciálne problém vyriešiť sám pomocou iného vstupu alebo môže problém nahlásiť vlastníkovi aplikácie.

Ako tvorca aplikácie môžete prevziať kontrolu nad chybami vo svojej aplikácii:

  • Zistenie a spracovanie chyby. Ak existuje možnosť, že sa vyskytne chyba, môžu sa zapísať vzorce aplikácie na zistenie chybového stavu a zopakovanie operácie. Koncový používateľ sa nemusí obávať, že nastala chyba, pretože tvorca túto možnosť zohľadnil. Toto sa vykonáva pomocou funkcií IfError, IsError a IsErrorOrBlank v rámci vzorca.
  • Vykazovanie chyby. Ak sa chyba nespracuje vo vzorci, v ktorom sa vyskytla, chyba sa potom prenesie do obsluhy udalosti App.OnError. Tu už chybu nemožno nahradiť, pretože sa už vyskytla a je súčasťou výpočtov vzorca. Môžete však použiť App.OnError na ovládanie spôsobu, akým sa chyba oznamuje koncovému používateľovi, vrátane úplného potlačenia hlásenia chýb. App.OnError tiež poskytuje spoločný záchytný bod pre hlásenie chýb v celej aplikácii.
  • Vytvorenie a opätovné vyvolanie chyby. Nakoniec môžete pomocou vlastnej logiky zistiť chybový stav, ktorý je špecifický pre vašu aplikáciu. Na vytvorenie vlastných chýb použite funkciu Error. Funkcia Error sa používa aj na opätovné vyhodenie chyby po tom, ako bola vypýtaná pomocou IfError alebo App.OnError.

Začíname

Začnime s jednoduchým príkladom.

  1. Vytvorte novú obrazovku v aplikácii plátna Power Apps.
  2. Vložte ovládací prvok TextInput. Bude mať predvolený názov TextInput1.
  3. Vložte ovládací prvok Label.
  4. Nastavte vlastnosť Text ovládacieho prvku Label na vzorec
1/Value( TextInput1.Text )

Chybový banner zobrazený s „hodnotu nemožno previesť na číslo“ pre ovládací prvok zadávania textu obsahujúci „Zadávanie textu“

Vyskytla sa chyba, pretože predvolený text ovládacieho prvku TextInput je "Text input", ktorý nemožno previesť na číslo. V predvolenom nastavení je to dobrá vec: koncový používateľ dostane upozornenie, že niečo v aplikácii nefunguje podľa očakávania.

Je zrejmé, že nechceme, aby sa pri každom spustení aplikácie objavila chyba. Pravdepodobne "Text input" nie je správne predvolené pole na zadávanie textu v každom prípade. Aby sme to napravili, zmeňme vlastnosť Default ovládacieho prvku TextInput na:

Blank()

Chybový banner zobrazený s „delením nulou“

Hmm, teraz máme inú chybu. Matematické operácie s prázdnou hodnotou, ako je delenie, vynútia hodnotu prázdneho miesta na nulu. A to teraz spôsobuje chybu delenia nulou. Aby sme to napravili, musíme sa rozhodnúť, aké je vhodné správanie pre túto situáciu v tejto aplikácii. Odpoveďou môže byť zobrazenie prázdnej hodnoty keď je textový vstup prázdny . Môžeme to dosiahnuť zabalením nášho vzorca pomocou funkcie IfError:

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

Nezobrazil sa žiadny chybový pruh, chyba v dôsledku prázdnej hodnoty bola nahradená prázdnou

Teraz je chyba nahradená platnou hodnotou a banner chyby zmizol. Ale možno sme prestrelili, IfError, ktorý sme použili, pokrýva všetky chyby vrátane zadania zlej hodnoty, napríklad "hello". Môžeme to vyriešiť tak, že upravíme funkciu IfError tak, aby riešila len prípad delenia nulou a všetky ostatné chyby zahadzovala:

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

Nezobrazil sa žiadny chybový nápis, chyba spôsobená špecificky delením nulou bola nahradená prázdnym miestom, inak sa chyba vyhodí znova

Spustite teda našu aplikáciu a vyskúšajte iné hodnoty.

Bez akejkoľvek hodnoty sa pri spustení aplikácie nezobrazí žiadna odpoveď, pretože predvolená hodnota je prázdna, ale nezobrazí sa ani žiadna chyba, pretože IfError nahradí chybu delenia nulou.

Žiadna odpoveď a žiadny chybový banner

Ak zadáme 4, dostaneme očakávaný výsledok 0,25:

0,25 zobrazených a žiadny chybový banner

A ak zadáme niečo nepovolené, napríklad hello, zobrazí sa nám banner s chybou:

Nezobrazuje sa žiadna hodnota a zobrazuje sa chybový banner pre nemožnosť previesť „ahoj“ na číslo

Toto je jednoduchý príklad na úvod. Spracovanie chýb je možné vykonať mnohými rôznymi spôsobmi v závislosti od potrieb aplikácie:

  1. Namiesto bannera s chybou sme mohli v ovládacom prvku Label so vzorcom zobraziť „#Error“. Aby boli typy náhrad kompatibilné s prvým argumentom pre IfError, musíme explicitne previesť číselný výsledok na textový reťazec pomocou funkcie Text.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    žiadny chybový banner a namiesto toho sa ako výsledok zobrazí #Error
  2. Namiesto toho, aby sme túto konkrétnu inštanciu obalili príkazom IfError, mohli sme napísať centralizovanú obsluhu udalosti App.OnError. Zobrazený reťazec nemôžeme nahradiť výrazom „#Error“, pretože k chybe už došlo a App.OnError je poskytovaná len na kontrolu prehľadov.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Šírenie chýb

Chyby prechádzajú cez vzorce podobne ako v Exceli. Napríklad v programe Excel, ak bunka A1obsahuje vzorec=1/0, potom A1 zobrazí chybovú hodnotu #DIV0!:

Tabuľka Excel s A1=1/0 a #DIV/0! zobrazené v bunke

Ak bunka A2odkazuje naA1 vzorec, napríklad =A1*2, potom sa chyba šíri aj cez tento vzorec:

Tabuľka Excel s A2=A1*2 a #DIV/0! zobrazené v bunke

Chyba nahradí hodnotu, ktorá by sa inak vypočítala. Pre násobenie v bunke A2 nie je žiadny výsledok , iba chyba z delenia v bunke A1.

Power Fx funguje rovnakým spôsobom. Vo všeobecnosti platí, že ak je chyba zadaná ako argument funkcie alebo operátora, operácia sa neuskutoční a vstupná chyba sa prejaví ako výsledok operácie. Napríklad Mid( Text( 1/0 ), 1, 1 ) vráti chybu Delenie nulou, pretože najvnútornejšia chyba prechádza cez funkciu Text a funkciu Mid:

Chybový banner zobrazujúci neplatnú operáciu: delenie nulou

Vo všeobecnosti chyby neprechádzajú cez vlastnosti ovládacieho prvku Power Apps. Rozšírme predchádzajúci príklad o ďalší ovládací prvok, ktorý zobrazí, ak je vlastnosť Text prvého štítka chybovým stavom:

Na druhom ovládacom štítku sa nezobrazuje žiadna chyba

Je v poriadku, že sa chyby nešíria cez ovládací prvok, pretože systém bude pozorovať chyby na vstupe všetkých vlastností ovládacieho prvku. Chyba sa nestratí.

Väčšina funkcií a operátorov sa riadi pravidlom „chyba dovnútra, chyba von“, existujú však výnimky. Funkcie IsError, IsErrorOrBlank a IfError sú určené na prácu s chybami, takže nemusia vrátiť chybu, aj keď je im odovzdaná.

Pozorovanie chýb

Chyby sa nepozorujú, kým sa nepoužije ich hodnota.

Výsledkom je, že funkcie If a Select tiež nemusia vrátiť chybu, ak je zadaná. Zvážte vzorec If( false, 1/0, 3 ). V tomto vzorci je chyba delenia nulou, ale keďže If nepreberá túto vetvu z dôvodu false, Power Fx a Power Apps neohlásia chybu:

Nezobrazuje sa žiadny chybový banner s funkciou If vo vlastnosti textu štítku

Použitie funkcie Set s chybou neohlási chybu v bode, v ktorom je chyba umiestnená do premennej. Napríklad v Power Apps je tu vzorec v App.OnStart, ktorý umiestni delenie nulovou chybou do premennej x:

Pri volaní funkcie Set v aplikácii App.OnStart sa nezobrazuje žiadny chybový pruh

Nie je hlásená žiadna chyba, pretože na x sa neodkazuje. Keď však pridáme ovládací prvok Label a nastavíme jeho vlastnosť Text na x, zobrazí sa chyba:

Zobrazuje sa chybový banner s ovládacím prvkom označenia odkazujúcim na premennú x

Chyby vo vzorci môžete sledovať pomocou funkcií IfError, IsError a IsErrorOrBlank. Pomocou týchto funkcií môžete vrátiť alternatívnu hodnotu, vykonať alternatívnu akciu alebo upraviť chybu skôr, ako bude spozorovaná a nahlásená.

Nahlasovanie chýb

Po spozorovaní chyby je ďalším krokom nahlásenie chyby koncovému používateľovi.

Na rozdiel od programu Excel nie je vždy vhodné miesto na zobrazenie výsledku chyby, pretože výsledok vzorca môže riadiť vlastnosť, napríklad súradnice X a Y ovládacieho prvku, pre ktorú nie je vhodné miesto na zobrazenie nejakého textu. Každý hostiteľ Power Fx riadi, ako sa chyby nakoniec zobrazia koncovému používateľovi a do akej miery má tvorca nad týmto procesom kontrolu. V Power Apps sa zobrazuje chybový banner a App.OnError sa používa na kontrolu spôsobu hlásenia chyby.

Je dôležité poznamenať, že App.OnError nemôže nahradiť chybu rovnakým spôsobom ako IfError . V okamihu, keď sa vykoná App.OnError, chyba už nastala a výsledok sa rozšíril prostredníctvom iných vzorcov. App.OnError iba riadi, ako sa chyba oznamuje koncovému používateľovi, a poskytuje výrobcovi možnosť zaznamenať chybu, ak je to potrebné.

Premenné rozsahu FirstError a AllErrors poskytujú kontextové informácie o chybe alebo chybách. Poskytuje to informácie o druhu chyby a o tom, kde chyba vznikla a kde bola pozorovaná.

Zastavenie po chybe

Vzorce správania podporujú vykonávanie akcií, úpravu databáz a zmenu stavu. Tieto vzorce umožňujú vykonať viac ako jednu akciu v sekvencii pomocou operátora reťazenia ; (alebo ;; v závislosti od miestneho nastavenia).

V tomto prípade napríklad ovládací prvok mriežky zobrazuje to, čo je v tabuľke T. Každý výber tlačidla zmení stav v tejto tabuľke pomocou dvoch volaní Patch:

Animácia zobrazujúca dva záznamy v tabuľke T, ktoré sa aktualizujú náhodnými číslami po každom kliknutí na tlačidlo

Vo vzorci zreťazeného správania sa akcie nezastavia po prvej chybe. Upravme náš príklad tak, aby pri prvom volaní Patch odovzdal neplatné číslo indexu. Druhé volanie Patch pokračuje aj napriek tejto predchádzajúcej chybe. Prvá chyba sa nahlási koncovému používateľovi a zobrazí sa ako chyba v aplikácii Studio na ovládacom prvku:

Animácia zobrazujúca iba druhý záznam v tabuľke T, ktorý sa aktualizuje náhodnými číslami po každom kliknutí na tlačidlo, pričom prvý záznam vedie k chybe

IfError je možné použiť na zastavenie vykonávania po chybe. Podobne ako pri funkcii If, tretí argument tejto funkcie poskytuje miesto na vloženie akcií, ktoré by sa mali vykonať iba v prípade, že nedôjde k žiadnej chybe:

Animácia neukazuje žiadne zmeny ani v jednom zázname v tabuľke T, pretože chyba IfError bráni dokončeniu druhej operácie po chybe

Ak sa vyskytne chyba počas jednej z iterácií ForAll, ostatné iterácie sa nezastavia. ForAll je navrhnutý tak, aby vykonával každú iteráciu nezávisle, čo umožňuje paralelné vykonávanie. Po dokončení For All sa vráti chyba, ktorá obsahuje všetky chyby, ktoré sa vyskytli (preskúmaním AllErrors v IfError alebo App.OnError).

Napríklad nasledujúci vzorec spôsobí, že ForAll vráti dve chyby (pre delenie nulou pre Value0, dvakrát) a Collection bude mať tri záznamy (keď Value nie je 0): [1, 2, 3].

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

Práca s viacerými chybami

Keďže vzorec správania môže vykonať viac ako jednu akciu, môže sa vyskytnúť aj viac ako jedna chyba.

Štandardne je prvá chyba hlásená koncovému užívateľovi. V tomto príklade zlyhajú obe volania Patch, druhé s chybou delenia nulou. Používateľovi sa zobrazí iba prvá chyba (o indexe):

Prvá chyba indexu zobrazená v chybovom pruhu, druhá chyba sa nehlási

Funkcia IfError a App.OnError môžu pristupovať ku všetkým chybám, ktoré sa vyskytli pri premennej rozsahu AllErrors. V tomto prípade to môžeme nastaviť na globálnu premennú a pozrieť sa na obe chyby. Zobrazujú sa v tabuľke v rovnakom poradí, v akom boli zaznamenané:

Zachytenie chýb do globálnej premennej PatchErrors, kde vidíme, že sa vyskytujú obe chyby

Viaceré chyby môžu byť vrátené aj v prípade, že nejde o vzorce správania. Napríklad použitie funkcie Patch s dávkou záznamov na aktualizáciu môže vrátiť viacero chýb, jednu pre každý záznam, ktorý zlyhá.

Chyby v tabuľkách

Ako sme už videli skôr, chyby môžu byť uložené v premenných. Chyby môžu byť zahrnuté aj v dátových štruktúrach, ako sú tabuľky. Je to dôležité, aby chyba v žiadnom zázname nemohla znehodnotiť celú tabuľku.

Zvážte napríklad tento ovládací prvok tabuľky údajov v Power Apps:

Tabuľka údajov zobrazujúca chybu pre pole Reciproká pre vstup 0, čo vedie k deleniu nulovou chybou

Pri výpočte v AddColumns sa zistila chyba delenia nulou pre jednu z hodnôt. Pre tento jeden záznam má stĺpec Recipročné chybovú hodnotu (delenie nulou), ale ostatné záznamy nie a sú v poriadku. IsError( Index( output, 2 ) ) vráti hodnotu false a IsError( Index( output, 2 ).Value ) vráti hodnotu true.

Ak sa pri filtrovaní tabuľky vyskytne chyba, celý záznam je chybou, ale stále sa vracia vo výsledku, takže koncový používateľ vie, že tam niečo bolo a že je problém.

Použime tento príklad. Tu pôvodná tabuľka neobsahuje žiadne chyby, ale filtrovanie vytvorí chybu vždy, keď sa Hodnota rovná 0:

Tabuľka údajov zobrazujúca chyby pre dva záznamy, ktoré nebolo možné spracovať podľa kritérií filtra

Hodnoty -5 a -3 sú správne odfiltrované. Hodnoty 0 majú za následok chybu pri spracovaní filtra, a preto nie je jasné, či má byť záznam zahrnutý alebo nie. Aby sme maximalizovali transparentnosť pre koncových používateľov a pomohli tvorcom pri ladení, namiesto originálu uvádzame záznam o chybe. V tomto prípade vráti IsError( Index( output, 2 ) ) hodnotu true.

Chyby zdroja údajov

Funkcie, ktoré upravujú údaje v zdrojoch údajov, napríklad Patch, Collect, Remove, RemoveIf, Update, UpdateIf a SubmitForm, hlásia chyby dvoma spôsobmi:

  • Každá z týchto funkcií vráti chybovú hodnotu ako výsledok operácie. Chyby možno zistiť pomocou IsError a nahradiť alebo potlačiť pomocou IfError a App. OnError ako obvykle.
  • Po operácii funkcia Errors vráti aj chyby pre predchádzajúce operácie. Môže to byť užitočné na zobrazenie chybovej správy na obrazovke formulára bez potreby zachytiť chybu v stavovej premennej.

Tento vzorec napríklad skontroluje chybu z Collect a zobrazí vlastnú chybovú správu:

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

Funkcia Error tiež vracia informácie o minulých chybách počas operácií spustenia. Môže to byť užitočné na zobrazenie chyby na obrazovke formulára bez potreby zachytiť chybu v stavovej premennej.

Opätovné vyhadzovanie chýb

Niekedy sa očakávajú niektoré potenciálne chyby a možno ich bezpečne ignorovať. Vnútri IfError a App.OnError, ak sa zistí chyba, ktorá by sa mala preniesť na najbližšiu vyššiu obsluhu udalosti, dá sa znova vyhodiť pomocou Error( AllErrors ).

Vytváranie vlastných chýb

Pomocou funkcie Error môžete vytvárať aj vlastné chyby.

Ak vytvárate svoje vlastné chyby, odporúča sa použiť hodnoty nad 1000, aby ste sa vyhli možným konfliktom s budúcimi hodnotami systémových chýb.

Hodnoty enumerácie ErrorKind

Enumerácia ErrorKind Hodnota Description
AnalysisError 18 Systémová chyba. Vyskytol sa problém s analýzou kompilátora.
BadLanguageCode 14 Bol použitý neplatný alebo nerozpoznaný kód jazyka.
BadRegex 15 Neplatný regulárny výraz. Skontrolujte syntax použitú s funkciami IsMatch, Match alebo MatchAll.
Konflikt 6 Aktualizovaný záznam už bol zmenený v zdroji a konflikt je potrebné vyriešiť. Bežným riešením je uložiť všetky lokálne zmeny, obnoviť záznam a znova použiť zmeny.
ConstraintViolated 8 Záznam neprešiel kontrolou obmedzení na serveri.
CreatePermission 3 Používateľ nemá oprávnenie na vytvorenie záznamu pre zdroj údajov. Napríklad bola zavolaná funkcia Collect.
DeletePermissions 5 Používateľ nemá oprávnenie na odstránenie záznamu pre zdroj údajov. Napríklad bola zavolaná funkcia Remove.
Div0 13 Delenie nulou.
EditPermissions 4 Používateľ nemá oprávnenie na vytvorenie záznamu pre zdroj údajov. Napríklad bola zavolaná funkcia Patch.
GeneratedValue 9 Na server bola chybne odovzdaná hodnota pre pole, ktoré server automaticky vypočítava.
InvalidFunctionUsage 16 Neplatné použitie funkcie. Jeden alebo viacero argumentov funkcie je často nesprávnych alebo použitých neplatným spôsobom.
FileNotFound 17 Úložisko SaveData sa nepodarilo nájsť.
InsufficientMemory 21 Na vykonanie operácie nie je v zariadení dostatok pamäte alebo úložiska.
InvalidArgument 25 Funkcii bol odovzdaný neplatný argument.
Interný 26 Systémová chyba. Vyskytol sa interný problém s jednou z funkcií.
MissingRequired 2 Chýbalo povinné pole záznamu.
Sieť 23 Vyskytol sa problém s komunikáciou v sieti
None 0 Systémová chyba. Chyba neexistuje.
Nevzťahuje sa 27 Nie je k dispozícii žiadna hodnota. Užitočné na odlíšenie prázdnej hodnoty, ktorú možno v numerických výpočtoch považovať za nulu, od prázdnych hodnôt, ktoré by mali byť označené ako potenciálny problém, ak sa hodnota použije.
NotFound 7 Záznam sa nenašiel. Napríklad záznam, ktorý sa má upraviť vo funkcii Patch.
NotSupported 20 Tento prehrávač alebo toto zariadenie nepodporuje operáciu.
Číselné 24 Numerická funkcia bola použitá nesprávnym spôsobom. Napríklad Sqrt s -1.
QuoteExceeded 22 Prekročená kvóta úložiska.
ReadOnlyValue 10 Stĺpec je len na čítanie a nie je možné ho upraviť.
ReadPermission 19 Používateľ nemá oprávnenie na čítanie záznamu pre zdroj údajov.
Synchronizovať 1 Zdroj údajov oznámil chybu. Ďalšie informácie nájdete v stĺpci Message.
Neznáme 12 Vyskytla sa chyba neznámeho typu.
Overenie 11 Záznam neprešiel overovacou kontrolou.