Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Chování popsané v tomto článku je k dispozici pouze v případě, že je zapnutá funkce správy chyb na úrovni vzorců .
Power Fx podporuje zpracování chyb na úrovni vzorců. Tato funkce je ve výchozím nastavení zapnutá pro všechny nové aplikace. Některé starší aplikace ho ale můžou mít vypnuté v nastavení aplikace. Nechte tuto funkci zapnutou.
- Otevřete plátnovou aplikaci v režimu úprav.
- Přejděte na kartu Nastavení>Aktualizace>Vyřazeno.
- Ujistěte se, že je vypnutá možnost Deaktivovat správu na úrovni vzorců.
Další informace naleznete v tématu Řízení, které funkce jsou povolené.
Chyby se stávají. Sítě padají, úložiště se zaplňuje, přitékají neočekávané hodnoty. Je důležité, aby vaše logika i nadále správně fungovala tváří v tvář potenciálním problémům.
Ve výchozím nastavení procházejí chyby prostřednictvím vzorců aplikace a jsou hlášeny koncovému uživateli aplikace. Tímto způsobem koncový uživatel ví, že se něco neočekávaně stalo. Můžou problém vyřešit sami jiným vstupem nebo můžou problém nahlásit vlastníkovi aplikace.
Jako tvůrce aplikací můžete převzít kontrolu nad chybami ve vaší aplikaci:
- Zjištění a zpracování chyby Pokud může dojít k chybě, napište vzorce aplikace, abyste zjistili chybový stav a zkuste operaci zopakovat. Koncový uživatel se nemusí obávat, že došlo k chybě, protože výrobce tuto možnost vzal v úvahu. Zachyťte chybu pomocí funkcí IfError, IsError a IsErrorOrBlank ve vzorci.
- Nahlásit chybu Pokud není chyba ošetřena ve vzorci, ve kterém jste na ni narazili, stoupá až k obslužné rutině App.OnError. Chybu nemůžete nahradit, protože už k ní došlo a je součástí výpočtů vzorců. Můžete však použít App.OnError k řízení toho, jak je chyba hlášena koncovému uživateli, včetně úplného potlačení hlášení chyb. App.OnError také poskytuje společný škrtící bod pro hlášení chyb v celé aplikaci.
- Vytvořte a znovu vyvolejte chybu. Nakonec můžete zjistit chybovou podmínku svojí vlastní logikou, podmínku specifickou pro aplikaci. Funkci Error použijte k vytvoření vlastních chyb. Pomocí funkce Error znovu vyvolat chybu po dotazování v IfError nebo App.OnError.
Začínáme
Začněme jednoduchým příkladem.
- Vytvořte novou obrazovku v aplikaci plátna Power Apps.
- Vložte ovládací prvek TextInput. Výchozí hodnota je TextInput1.
- Vložte ovládací prvek Label.
- Nastavte vlastnost Text ovládacího prvku Label na vzorec
1/Value( TextInput1.Text )
Zobrazí se chyba, protože výchozí text ovládacího prvku TextInput je "Text input", který nelze převést na číslo. Ve výchozím nastavení je to dobrá věc: Koncový uživatel dostane oznámení, že v aplikaci něco nefunguje podle očekávání.
Samozřejmě nechcete, aby se uživateli při každém spuštění této aplikace zobrazila chyba.
"Text input" pravděpodobně stejně není to správné výchozí pole pro zadávání textu. Chcete-li tento problém vyřešit, změňte Vlastnost Default ovládacího prvku TextInput na:
Blank()
Hmm, teď se zobrazí jiná chyba. Matematické operace, jako je například dělení s prázdnou hodnotou, vynutí přeměnu této hodnoty na nulu. Tato hodnota způsobí chybu dělení nulou. Chcete-li tento problém vyřešit, musíte se rozhodnout, jaké je vhodné chování pro tuto situaci v této aplikaci. Odpověď může být ukázat prázdno, když je textový vstup prázdný. Tento cíl můžete dosáhnout zabalením vzorce pomocí funkce IfError :
IfError( 1/Value( TextInput1.Text ), Blank() )
Nyní je chyba nahrazena platnou hodnotou a informační zpráva o chybě zmizí. Možná jste to ale přehnali, funkce IfError, kterou jste použili, pokrývá všechny chyby, včetně zadání nesprávné hodnoty, například "hello". Tento problém můžete vyřešit tak, že vyladíte IfError aby zpracoval pouze případ dělení nulou a znovu vyvoláte všechny ostatní chyby.
IfError( 1/Value( TextInput1.Text ),
If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )
Spusťte aplikaci a vyzkoušejte několik různých hodnot.
Bez hodnoty, jako když se aplikace spustí, se nezobrazí žádná odpověď, protože výchozí hodnota je prázdná, ale také se nezobrazí žádná chyba, protože IfError nahradí chybu dělení nulou.
Pokud zadáte hodnotu 4, získáte očekávaný výsledek 0,25:
A pokud zadáte něco neplatného, například hello, zobrazí se chybová zpráva:
Toto je jednoduchý příklad na úvod. Chyby můžete zpracovávat mnoha různými způsoby v závislosti na potřebách aplikace:
- Místo banneru s chybou můžete v popisku s ovládacím prvkem a vzorcem zobrazit „#Error“. Chcete-li zachovat typy nahrazení kompatibilní s prvním argumentem ifError, je nutné explicitně převést číselný výsledek na textový řetězec pomocí funkce Text .
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- Místo zabalení této konkrétní instance pomocí ifError byste mohli napsat centralizovanou obslužnou rutinu App.OnError . Řetězec zobrazený jako "#Error" nelze nahradit, protože k chybě již došlo a App.OnError je k dispozici pouze pro správu hlášení chyb.
If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
Šíření chyb
Chyby procházejí vzorci stejně jako v Excelu. Například v Excelu, pokud buňka A1 obsahuje vzorec =1/0, pak A1 zobrazí chybovou hodnotu #DIV0!:
Pokud buňka A2 odkazuje na A1 pomocí vzorce, jako je například =A1*2, chyba se rozšíří i tímto vzorcem:
Chyba nahradí hodnotu, kterou by vzorec jinak vypočítal. Neexistuje žádný výsledek pro násobení v buňce A2, pouze chyba z dělení v A1.
Power Fx funguje stejným způsobem. Obecně platí, že pokud jako argument funkce nebo operátoru zadáte chybu, neproběhne operace. Vstupní chyba se projeví jako výsledek operace. Například Mid( Text( 1/0 ), 1, 1 ) vrátí chybu Dělení nulou, protože nejvnitřnější chyba prochází funkcí Text a funkcí Mid.
Obecně platí, že chyby neprotékají vlastnostmi ovládacího prvku Power Apps. Pojďme předchozí příklad rozšířit o jiný ovládací prvek, který se zobrazí, pokud je vlastnost prvního popisku Text chybový stav:
Je v pořádku, že chyby se nešírují prostřednictvím ovládacího prvku, protože systém sleduje chyby na vstupu do všech vlastností ovládacího prvku. Chyba se neztratí.
Většina funkcí a operátorů se řídí pravidlem „chyba dovnitř, chyba ven“, ale existují výjimky. Funkce IsError, IsErrorOrBlank a IfError jsou určené pro práci s chybami, takže nemusí vracet chybu, i když je do nich předána.
Pozorování chyb
Power Fx nechytá chyby, dokud vzorec nepoužívá chybovou hodnotu.
V důsledku toho nemusí funkce If a Select vracet chybu, pokud je předána. Zvažte vzorec If( false, 1/0, 3 ). V tomto vzorci existuje chyba dělení nulou, ale protože funkce If tuto větev kvůli podmínce false nebere, Power Fx a Power Apps neohlásí chybu.
Použití funkce Set s chybou neohlásí chybu v okamžiku, kdy je chyba umístěna do proměnné. Například v Power Apps je zde vzorec v App.OnStart, který umístí dělení nulovou chybou do proměnné x:
Není hlášena žádná chyba, protože na x není odkazováno. Když však přidáte ovládací prvek popisku a nastavíte jeho vlastnost Text na x, zobrazí se chyba:
Chyby ve vzorci můžete sledovat pomocí funkcí IfError, IsError a IsErrorOrBlank . Pomocí těchto funkcí můžete vrátit alternativní hodnotu, provést alternativní akci nebo upravit chybu, než se zjistí a nahlásí.
Hlášení chyb
Jakmile Power Fx zjistí chybu, dalším krokem je nahlásit chybu koncovému uživateli.
Na rozdíl od Excelu není vždy vhodné místo k zobrazení chybového výsledku, protože výsledkem vzorce může být vlastnost, jako jsou souřadnice X a Y ovládacího prvku, pro který není vhodné zobrazit nějaký text. Každý hostitel Power Fx řídí, jak se chyby nakonec zobrazí koncovému uživateli a jakou kontrolu má nad tímto procesem tvůrce. V Power Apps se zobrazí banner s chybou a App.OnError slouží k řízení způsobu hlášení chyby.
Je důležité si uvědomit, že App.OnError nemůže nahradit chybu stejným způsobem jako IfError. V okamžiku, kdy se app.OnError spustí, se chyba už stala a výsledek se rozšíří prostřednictvím jiných vzorců. App.OnError pouze řídí, jak je chyba hlášena koncovému uživateli, a v případě potřeby poskytuje tvůrci možnost chybu zaznamenat.
Proměnné oboru FirstError a AllErrors poskytují kontextové informace o chybě nebo chybách. Tento kontext poskytuje informace o druhu chyby, kde došlo k chybě a kde byla zjištěna.
Zastavení po chybě
Vzorce chování podporují provádění akcí, úpravy databází a změnu stavu. Tyto vzorce umožňují provedení více akcí v posloupnosti pomocí operátoru ; řetězení (nebo ;; v závislosti na národním prostředí).
V tomto případě například ovládací prvek mřížky ukazuje, co je v T tabulce. Každý výběr tlačítka změní stav v této tabulce pomocí dvou volání Patch:
Ve vzorci zřetězeného chování se akce nezastaví po první chybě. Upravme náš příklad tak, aby v prvním volání Patch předal neplatné indexové číslo. Druhé volání Patch pokračuje i přes tuto dřívější chybu. První chyba je nahlášena koncovému uživateli a zobrazena jako chyba v aplikaci Studio na ovládacím prvku:
K zastavení provádění po chybě použijte IfError . Podobně jako u funkce If poskytuje třetí argument této funkce místo pro vložení akcí, které by měly být provedeny pouze v případě, že nedojde k žádné chybě:
Pokud dojde k chybě během jedné z iterací funkce ForAll, ostatní iterace se nezastaví. Metoda ForAll je navržena tak, aby každou iteraci spouštěla nezávisle, což umožňuje paralelní provádění. Po dokončení funkce ForAll se vrátí chyba, která obsahuje všechny zjištěné chyby (prozkoumáním všech chyb v iferror nebo App.OnError).
Výsledkem následujícího vzorce je například to, že Funkce ForAll vrací dvě chyby (kvůli dělení nulou, když Value má hodnotu 0, dvakrát) a Collection obsahuje tři záznamy (když Value není 0): [1, 2, 3].
Clear( Collection );
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );
Práce s více chybami
Vzhledem k tomu, že vzorec chování může provést více než jednu akci, může také narazit na více než jednu chybu.
Ve výchozím nastavení aplikace hlásí koncovému uživateli první chybu. V tomto příkladu obě volání Patch selžou, ale druhé volání selže s chybou dělení nulou. Uživateli se zobrazí pouze první chyba týkající se indexu:
Funkce IfError a App.OnError mají přístup ke všem chybám, ke kterým došlo pomocí proměnné oboru AllErrors . V tomto případě můžete tuto proměnnou nastavit na globální proměnnou a podívat se na obě zjištěné chyby. Objevují se v tabulce ve stejném pořadí, ve kterém se vyskytly:
Vzorce bez chování můžou také vracet více chyb. Například použití funkce Patch s dávkou záznamů k aktualizaci může vrátit více chyb, jednu pro každý záznam, který selže.
Chyby v tabulkách
Jak jste viděli dříve, můžete chyby ukládat do proměnných. Do datových struktur, jako jsou tabulky, můžete také zahrnout chyby. Tento přístup je důležitý, protože zajišťuje, že chyba u každého záznamu nemůže zneplatnit celou tabulku.
Zvažte například tento ovládací prvek datové tabulky v Power Apps:
Při výpočtu v doplňku AddColumns došlo k chybě dělení nulou pro jednu z hodnot. Pro tento jeden záznam má sloupec Reciprocal chybovou hodnotu (dělení nulou), ale ostatní záznamy ji nemají a jsou v pořádku.
IsError( Index( output, 2 ) ) vrací hodnotu false a IsError( Index( output, 2 ).Value ) vrací hodnotu true.
Pokud při filtrování tabulky dojde k chybě, stane se celý záznam chybou. Operace stále vrací záznam ve výsledku, aby koncový uživatel věděl, že tam něco bylo a existuje problém.
Vezměte tento příklad. Zde původní tabulka neobsahuje žádné chyby, ale akt filtrování vytvoří chybu, kdykoli je Hodnota rovna 0:
Hodnoty −5 a −3 jsou správně odfiltrovány. Hodnoty 0 vedou k chybě při zpracování filtru, a proto není jasné, zda má být záznam ve výsledku zahrnut či nikoli. Aby se maximalizovala transparentnost pro koncové uživatele a pomohlo to tvůrcům s laděním, operace zahrnuje záznam o chybě namísto původního. V tomto případě IsError( Index( output, 2 ) ) vrátí true.
Chyby zdroje dat
Funkce, které mění zdroje dat, jako Patch, Collect, Remove, RemoveIf, Update, UpdateIf a SubmitForm hlásí chyby dvěma způsoby:
- Každá z těchto funkcí vrátí chybovou hodnotu jako výsledek operace. Chyby můžete rozpoznat pomocí isError a nahradit nebo potlačit chyby pomocí IfError a App.OnError jako obvykle.
- Po operaci vrátí funkce Errors také chyby pro předchozí operace. Toto chování může být užitečné pro zobrazení chybové zprávy na obrazovce formuláře, aniž by bylo nutné zachytit chybu ve stavové proměnné.
Tento vzorec například zkontroluje chybu v nástroji Collect a zobrazí vlastní chybovou zprávu:
IfError( Collect( Names, { Name: "duplicate" } ),
Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )
Funkce Errors také vrací informace o minulých chybách během běhových operací. To může být užitečné pro zobrazení chyby na obrazovce formuláře, aniž by bylo nutné zachytit chybu ve stavové proměnné.
Opakované vyvolání chyb
Někdy očekáváte potenciální chyby a můžete je bezpečně ignorovat. Pokud je uvnitř IfError a App.OnError zjištěna chyba, která by se měla předat následující vyšší obslužné rutině, znovu ji vyvolejte pomocí Error( AllErrors ).
Vytváření vlastních chyb
Vlastní chyby můžete také vytvořit pomocí funkce Error .
Pokud vytvoříte vlastní chyby, použijte hodnoty větší než 1 000, abyste se vyhnuli potenciálním konfliktům s budoucími systémovými chybovými hodnotami.
Hodnoty výčtu ErrorKind
| Výčet ErrorKind | Hodnota | Description |
|---|---|---|
| ChybaAnalýzy | 18 | Systémová chyba. Došlo k problému s analýzou kompilátoru. |
| ChybnýKódJazyka | 14 | Byl použit neplatný nebo nerozpoznaný kód jazyka. |
| BadRegex | 15 | Neplatný regulární výraz. Zkontrolujte syntaxi použitou u funkce IsMatch, Match nebo MatchAll. |
| Conflict | 6 | Záznam, který aktualizujete, se už změnil ve zdroji a potřebujete konflikt vyřešit. Běžným řešením je uložit všechny místní změny, aktualizovat záznam a znovu použít změny. |
| Porušení omezení | 8 | Záznam neprošel kontrolou omezení na serveru. |
| Vytvořit oprávnění | 3 | Nemáte oprávnění k vytvoření záznamu pro zdroj dat. Například byla volána funkce Collect. |
| Smazat oprávnění | 5 | Nemáte oprávnění k odstranění záznamu pro zdroj dat. Například byla volána funkce Remove. |
| Div0 | 13 | Dělení nulou. |
| UpravitOprávnění | 4 | Nemáte oprávnění k vytvoření záznamu pro zdroj dat. Například byla volána funkce Patch. |
| GenerovanáHodnota | 9 | Hodnota byla chybně předána serveru pro pole, které server automaticky vypočítá. |
| InvalidFunctionUsage | 16 | Neplatné použití funkce. Často je jeden nebo více argumentů funkce nesprávné nebo použité neplatným způsobem. |
| SouborNenalezen | 17 | Úložiště SaveData nebylo nalezeno. |
| NedostatečnáPaměť | 21 | Na zařízení není dostatek paměti nebo úložiště pro operaci. |
| NeplatnýArgument | 25 | Funkci byl předán neplatný parametr. |
| Interní | 26 | Systémová chyba. Došlo k internímu problému s jednou z těchto funkcí. |
| MissingRequired | 2 | Chybí požadované pole záznamu. |
| Síť | 23 | Došlo k problému se síťovými komunikacemi. |
| None | 0 | Systémová chyba. Není žádná chyba. |
| Nelze použít | 27 | K dispozici není žádná hodnota. Tato chyba je užitečná k odlišení prázdné hodnoty, kterou lze v numerických výpočtech považovat za nulu, od prázdných hodnot, které by se měly označit jako potenciální problém, pokud se hodnota použije. |
| Nenalezeno | 7 | Záznam nebyl nalezen. Například záznam, který má být upraven ve funkci Patch. |
| Nepodporováno | 20 | Operace, kterou tento přehrávač nebo zařízení nepodporuje. |
| Číselné | 24 | Numerická funkce byla použita nesprávným způsobem. Například Sqrt s −1. |
| KvótaPřekročena | 22 | Překročena kvóta úložiště. |
| hodnota jen pro čtení | 10 | Sloupec je pouze pro čtení a nelze jej upravit. |
| Oprávnění ke čtení | 19 | Nemáte oprávnění ke čtení záznamů pro zdroj dat. |
| Synchronizace | 1 | Zdroj dat oznámil chybu. Další informace najdete ve sloupci Zpráva. |
| Neznámý | 12 | Došlo k chybě neznámého typu. |
| Ověřování | 11 | Záznam neprošel ověřovací kontrolou. |