Zpracování chyb

Poznámka:

Chování popsané v tomto článku je k dispozici pouze v případě, že je zapnutá funkce Preview Správa chyb na úrovni vzorců v části Nastavení>Nadcházející funkce>Preview. Více informací: Nastavení toho, které funkce jsou zapnuté

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 stalo něco neočekávaného, může potenciálně problém vyřešit sám pomocí jiného vstupu nebo může problém nahlásit vlastníkovi aplikace.

Jako tvůrce aplikací můžete převzít kontrolu nad chybami ve své aplikaci:

  • Detekce chyb a práce s nimi. Pokud existuje možnost, že může dojít k chybě, lze zapsat vzorce aplikace, aby detekovaly chybový stav a opakovaly operaci. Koncový uživatel se nemusí obávat, že došlo k chybě, protože výrobce tuto možnost vzal v úvahu. To se dělá pomocí funkcí IfError, IsError a IsErrorOrBlank ve vzorci.
  • Nahlášení chyby. Pokud chyba není zpracována ve vzorci, kde k ní došlo, chyba se poté přenese do obslužné rutiny App.OnError. Zde již nelze chybu nahradit, protože se již vyskytla 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ření a opětovné vyvolání chyby. Nakonec můžete pomocí své vlastní logiky zjistit chybový stav, což je stav, který je specifický pro vaši aplikaci. Funkci Error použijte k vytvoření vlastních chyb. Funkce Error se používá také k opětovnému vyvolání chyby po průzkumu chyby v IfError nebo App.OnError.

Začínáme

Začněme jednoduchým příkladem.

  1. Vytvořte novou obrazovku v aplikaci plátna Power Apps.
  2. Vložte ovládací prvek TextInput. Výchozí bude název TextInput1.
  3. Vložte ovládací prvek Label.
  4. Nastavte vlastnost Text ovládacího prvku Label na vzorec
1/Value( TextInput1.Text )

Chybový banner zobrazený se zprávou „hodnotu nelze převést na číslo“ pro ovládací prvek zadávání textu obsahující „Text input“

Došlo k chybě, protože výchozí text ovládacího prvku TextInput je "Text input", což nelze převést na číslo. Ve výchozím nastavení je to dobrá věc: koncový uživatel dostane upozornění, že něco v aplikaci nefunguje podle očekávání.

Samozřejmě nechceme, aby se uživateli při každém spuštění této aplikace objevila chyba. "Text input" pravděpodobně stejně není to správné výchozí pole pro zadávání textu. Pro nápravu změníme vlastnost Default ovládacího prvku TextInput na:

Blank()

Zobrazí se chybový banner se zprávou „dělení nulou“

Hmm, teď máme jinou chybu. Matematické operace s prázdným místem, jako je dělení, vynutí hodnotu prázdného místa na nulu. A to nyní způsobuje chybu dělení nulou. Abychom to napravili, musíme se rozhodnout, jaké je vhodné chování pro tuto situaci v této aplikaci. Odpovědí může být zobrazeníprázdné, když je textový vstup prázdný. Můžeme toho dosáhnout zabalením našeho vzorce do funkce IfError:

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

Nezobrazil se žádný chybový banner, chyba způsobená prázdnou hodnotou byla nahrazena prázdnou hodnotou

Nyní je chyba nahrazena platnou hodnotou a nápis s chybou zmizel. Ale možná jsme přestřelili, IfError, kterou jsme použili, pokrývá všechny chyby, včetně zadání špatné hodnoty, např. jako "hello". Můžeme to vyřešit vyladěním IfError tak, aby obsluhovala pouze případ dělení nulou a všechny ostatní chyby znovu vyvolala:

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

Nezobrazuje se žádný chybový banner, chyba způsobená specificky dělením nulou byla nahrazena prázdnou hodnotou, jinak je chyba vyvolána znovu

Spusťte tedy aplikaci a vyzkoušejte jiné hodnoty.

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.

Žádná odpověď a žádný chybový banner

Pokud zadáme 4, dostaneme očekávaný výsledek 0,25:

Zobrazí se 0,25 a žádný chybový banner

A pokud zadáme něco nesprávného, například hello, zobrazí se nám banner s chybou:

Nezobrazí se žádná hodnota a zobrazí se chybový banner pro nemožnost převést „hello“ na číslo

Toto je jednoduchý příklad na úvod. Zpracování chyb lze provést mnoha různými způsoby v závislosti na potřebách aplikace:

  1. Místo banneru s chybou jsme mohli v ovládacím prvku štítku se vzorcem zobrazit „#Chyba“ . Aby byly typy náhrad kompatibilní s prvním argumentem IfError, musíme explicitně převést číselný výsledek na textový řetězec funkcí Text.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Žádný chybový banner a místo toho se jako výsledek zobrazí #Error
  2. Namísto zabalení této konkrétní instance pomocí IfError jsme mohli napsat centralizovanou obslužnou rutinu App.OnError. Zobrazený řetězec nemůžeme nahradit výrazem „#Chyba“, protože k chybě již došlo a App.OnError slouží pouze ke kontrole hlášení.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Propagace chyby

Chyby procházejí vzorci stejně jako v Excelu. Pokud například v Excelu má buňka A1 vzorec =1/0, pak A1 zobrazí chybovou hodnotu #DIV0!:

Excelová tabulka s A1=1/0 a #DIV/0! zobrazenými v buňce

Pokud buňka A2 odkazuje na A1 se vzorcem jako =A1*2, pak se chyba šíří také tímto vzorcem:

Excelová tabulka s A2=A1*2 a #DIV/0! zobrazenými v buňce

Chyba nahradí hodnotu, která by jinak byla vypočtena. 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 je funkce nebo operátoru poskytnuta jako argument chyba, operace se neuskuteční a chyba vstupu projde 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:

Chybový banner zobrazující neplatnou operaci: dělení nulou

Chyby obecně neprocházejí vlastnostmi ovládacího prvku Power Apps . Rozšiřme předchozí příklad o další ovládací prvek, který zobrazí, pokud je vlastnost Text prvního štítku chybovým stavem:

Na druhém ovládacím prvku popisku se nezobrazuje žádná chyba

Je v pořádku, že se chyby nešíří ovládacím prvkem, protože systém bude pozorovat 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 navrženy pro práci s chybami, takže nemusí vrátit chybu, i když je do nich předána.

Pozorování chyb

Chyby nejsou pozorovány, dokud není použita jejich hodnota.

V důsledku toho funkce If a Select také nemusí vrátit chybu, pokud je předána. Zvažte vzorec If( false, 1/0, 3 ). V tomto vzorci je chyba dělení nulou, ale protože If tuto větev nebere kvůli false, Power Fx a Power Apps neohlásí chybu:

Nezobrazuje se žádný chybový banner s funkcí If ve vlastnosti Text popisku

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:

Při volání funkce Set v App.OnStart se nezobrazuje žádný chybový banner

Není hlášena žádná chyba, protože na x není odkazováno. Ve chvíli, kdy přidáme ovládací prvek štítku a nastavíme jeho vlastnost Text na x, zobrazí se chyba:

Zobrazuje se chybový banner s ovládacím prvkem popisku odkazujícím na proměnnou x

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 předtím, než bude pozorována a hlášena.

Hlášení chyb

Po zjištění chyby je dalším krokem nahlášení chyby koncovému uživateli.

Na rozdíl od Excelu není vždy vhodné místo pro zobrazení výsledku chyby, protože výsledek vzorce může řídit vlastnost, jako jsou souřadnice X a Y ovládacího prvku, pro který neexistuje vhodné místo pro zobrazení nějakého textu. 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í chybový banner a App.OnError se používá ke kontrole 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. Když je vykonána funkce App.OnError, chyba již nastala a výsledek je propagován přes ostatní vzorce. App.OnError pouze řídí, jak je chyba hlášena koncovému uživateli, a poskytuje tvůrci možnost zaznamenat chybu, pokud si to přeje.

Proměnné oboru FirstError a AllErrors poskytují kontextové informace o chybě nebo chybách. To poskytuje informace o druhu chyby a o tom, kde chyba vznikla a kde byla pozorována.

Zastavení po chybě

Vzorce chování podporují provádění akcí, úpravy databází a změnu stavu. Tyto vzorce umožňují provést více než jednu akci v sekvenci 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 tabulce T. Každý výběr tlačítka změní stav v této tabulce pomocí dvou volání Patch:

Animace zobrazující dva záznamy v tabulce T, které jsou aktualizovány náhodnými čísly po každém kliknutí na tlačítko

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:

Animace zobrazující pouze druhý záznam v tabulce T, který je aktualizován náhodnými čísly po každém kliknutí na tlačítko, přičemž první záznam má za následek chybu

IfError lze použít k zastavení provádění po chybě. 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ě:

Animace neukazuje žádné změny ani u jednoho záznamu v tabulce T, protože IfError brání dokončení druhé operace po chybě

Pokud dojde k chybě během jedné z iterací ForAll, zbývající iterace se nezastaví. ForAll je navrženo tak, aby každou iteraci provedlo nezávisle, což umožňuje paralelní provádění. Po dokončení ForAll bude vrácena chyba, která obsahuje všechny zjištěné chyby (prozkoumáním AllErrors v IfError nebo App.OnError).

Například následující vzorec bude mít za výsledek, že ForAll vrátí dvě chyby (pro dělení nulou pro Value 0 dvakrát) a Collection bude mít tři záznamy (pro situace, 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í je první chyba hlášena koncovému uživateli. V tomto příkladu selžou obě volání Patch, druhé s chybou dělení nulou. Uživateli se zobrazí pouze první chyba (o indexu):

První chyba indexu zobrazena v chybovém banneru, druhá chyba není vykázána

Funkce IfError a App.OnError mají přístup ke všem chybám, na které narazíte u proměnné oboru AllErrors. V tomto případě to můžeme 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:

Zachycení chyb do globální proměnné PatchErrors, kde vidíme, že se vyskytují obě chyby

Více chyb může být vráceno i ve vzorcích bez chování. 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 jsme viděli dříve, chyby mohou být uloženy do proměnných. Chyby lze také zahrnout do datových struktur, jako jsou tabulky. To je důležité, aby chyba v žádném záznamu nemohla zneplatnit celou tabulku.

Zvažte například tento ovládací prvek datové tabulky v Power Apps:

Datová tabulka zobrazující chybu pro pole Reciprocal pro vstup 0, což má za následek dělení nulovou chybou

Výpočet v AddColumns zjistil chybu dělení nulou pro jednu z hodnot. Pro tento jeden záznam má sloupec Reciprocal chybovou hodnotu (dělení nulou), ale ostatní záznamy ne a jsou v pořádku. IsError( Index( output, 2 ) ) vrátí hodnotu false a IsError( Index( output, 2 ).Value ) vrátí hodnotu true.

Pokud při filtrování tabulky dojde k chybě, celý záznam je chybou, ale přesto se vrací ve výsledku, takže koncový uživatel ví, že tam něco bylo a že je 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:

Datová tabulka zobrazující chyby pro dva záznamy, které nebylo možné zpracovat podle kritérií filtru

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. Abychom maximalizovali transparentnost pro koncové uživatele a pomohli tvůrcům ladění, vkládáme místo originálu záznam o chybě. 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 lze detekovat pomocí IsError a nahradit nebo potlačit pomocí IfError a App.OnError jako obvykle.
  • Po operaci vrátí funkce Errors také chyby pro předchozí operace. To 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 z 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 se očekávají některé potenciální chyby a lze je bezpečně ignorovat. Uvnitř IfError a App.OnError, pokud je zjištěna chyba, která by měla být předána další vyšší obslužné rutině, lze ji znovu vyvolat pomocí funkce Error( AllErrors ).

Vytváření vlastních chyb

Pomocí funkce Error můžete také vytvářet vlastní chyby.

Pokud vytváříte své vlastní chyby, doporučuje se používat hodnoty nad 1000, abyste předešli potenciálním konfliktům s budoucími hodnotami systémových chyb.

Hodnoty výčtu ErrorKind

Výčet ErrorKind Hodnota Description
AnalysisError 18 Chyba systému. Vyskytl se problém s analýzou kompilátoru.
BadLanguageCode 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.
Konflikt 6 Aktualizovaný záznam byl již u zdroje změněn a konflikt je třeba 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.
ConstraintViolated 8 Záznam neprošel kontrolou omezení na serveru.
CreatePermission 3 Uživatel nemá oprávnění k vytvoření záznamu pro zdroj dat. Například byla volána funkce Collect.
DeletePermissions 5 Uživatel nemá oprávnění k odstranění záznamu pro zdroj dat. Například byla volána funkce Remove.
Div0 13 Dělení nulou.
EditPermissions 4 Uživatel nemá oprávnění k vytvoření záznamu pro zdroj dat. Například byla volána funkce Patch.
GeneratedValue 9 Serveru byla chybně předána hodnota pro pole, které server automaticky vypočítává.
InvalidFunctionUsage 16 Neplatné použití funkce. Často je jeden nebo více argumentů funkce nesprávné nebo použité neplatným způsobem.
FileNotFound 17 Úložiště SaveData nebylo nalezeno.
InsufficientMemory 21 V zařízení není dostatek paměti nebo úložiště pro operaci.
InvalidArgument 25 Funkci byl předán neplatný argument.
Interní 26 Chyba systému. Došlo k vnitřnímu problému s jednou z funkcí.
MissingRequired 2 Chybělo povinné pole záznamu.
Síť 23 Došlo k problému se síťovou komunikací.
Žádné 0 Chyba systému. Není žádná chyba.
Nelze použít 27 K dispozici není žádná hodnota. Užitečné odlišovat prázdnou hodnotu, kterou lze v numerických výpočtech považovat za nulu, od prázdných hodnot, které by měly být označeny jako potenciální problém, pokud je hodnota použita.
NotFound 7 Záznam nebyl nalezen. Například záznam, který má být upraven ve funkci Patch.
NotSupported 20 Operace, kterou tento přehrávač nebo zařízení nepodporuje.
Číslo 24 Numerická funkce byla použita nesprávným způsobem. Například Sqrt s −1.
QuoteExceeded 22 Překročena kvóta úložiště.
ReadOnlyValue 10 Sloupec je pouze pro čtení a nelze jej upravit.
ReadPermission 19 Uživatel nemá oprávnění ke čtení záznamu pro zdroj dat.
Synchronizace 0 Zdroj dat oznámil chybu. Další informace najdete ve sloupci Zpráva.
Neznámý 12 Došlo k chybě neznámého typu.
Ověření 11 Záznam neprošel ověřovací kontrolou.