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ú tlmivku 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.
- Vytvorte novú obrazovku v aplikácii plátna Power Apps.
- Vložte ovládací prvok TextInput. Bude mať predvolený názov TextInput1.
- Vložte ovládací prvok Label.
- Nastavte vlastnosť Text ovládacieho prvku Label na vzorec
1/Value( TextInput1.Text )
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()
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() )
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 ) ) )
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.
Ak zadáme 4, dostaneme očakávaný výsledok 0,25:
A ak zadáme niečo nepovolené, napríklad hello
, zobrazí sa nám banner s chybou:
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:
- 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" )
- 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 A1
obsahuje vzorec=1/0
, potom A1 zobrazí chybovú hodnotu #DIV0!
:
Ak bunka A2
odkazuje naA1
vzorec, napríklad =A1*2
, potom sa chyba šíri aj cez tento vzorec:
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:
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:
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:
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
:
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:
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:
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:
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:
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 Value
0, 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):
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é:
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:
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:
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. |