Kļūdu apstrāde

Note

Šajā rakstā aprakstītā darbība ir pieejama tikai tad, ja caur Iestatījumi>Gaidāmie līdzekļi>Priekšskatījums iespējojat priekšskatījuma līdzekli Formulas līmeņa kļūdu pārvaldība. Papildinformācija: Kontrolējiet, kuri līdzekļi ir iespējoti

Kļūdas rodas. Tīkli sabrūk, krātuves aizpildās un ieplūst negaidītas vērtības. Ir svarīgi, lai jūsu loģika joprojām darbotos pareizi, ņemot vērā iespējamas problēmas.

Pēc noklusējuma kļūdas plūst caur programmas formulām un par tām tiek ziņots programmas gala lietotājam. Tādējādi lietotājs var uzzināt, ka noticis kas neparedzēts, viņš, iespējams, var novērst pašu problēmu, izmantojot citu ievadi, vai arī viņi par problēmu var ziņot programmas īpašniekam.

Kā programmu veidotājs varat kontrolēt kļūdas savā programmā:

  • Kļūdu noteikšana un apstrāde. Ja var rasties kļūda, programmas formulas var rakstīt, lai noteiktu kļūdas nosacījumu un vēlreiz mēģinātu veikt operāciju. Gala lietotājam nav jāuztraucas par to, ka radusies kļūda, jo veidotājs šādu iespēju ir ņēmis vērā. Tas tiek darīts, izmantojot formulas funkciju IfErrorIsError un IsErrorOrBlank.
  • Ziņošana par kļūdu. Ja kļūda netiek apstrādāta tajā formulas vietā, kur tā tika atrasta, kļūda tiek pārvietota apstrādātājā App.OnError. Šo kļūdu vairs nevar aizstāt, jo tā jau ir notikusi, un tā ir daļa no formulas aprēķiniem. Taču varat izmantot AppOnError, lai kontrolētu to, kā par kļūdu tiek lietots gala lietotājam, tostarp kopumā slāpējot ziņošanu par kļūdām. App.On Savā tiek nodrošināts arī izplatītu kļūdu uzrādīšanas punkts visā programmā.
  • Kļūdas izveide un atkārtota atmešana. Visbeidzot, jūs varat noteikt kļūdas nosacījumu ar savu loģiku — jūsu programmai raksturīgu nosacījumu. Izmantojiet funkciju Kļūda, lai izveidotu pielāgotas kļūdas. Funkcija Kļūda tiek izmantota arī, lai atkārtotu kļūdu pēc tam, kad tiek pārbaudīta IfError or App.OnError.

Darba sākšana

Sāksim ar vienkāršu piemēru.

  1. Izveidojiet jaunu ekrānu Power Apps pamatnes programmā.
  2. Ievadiet vadīklu TextInput. Pēc noklusējuma tiek lietots nosaukums TextInput1.
  3. Ievietojiet vadīklu Etiķete.
  4. Iestatiet vadīklas Etiķete rekvizītu Teksts formulā
1/Value( TextInput1.Text )

Kļūdas reklāmkarogs, kas parādīts ar

Ir radusies kļūda, jo noklusējuma vadīklas teksts TextInput ir "Text input", ko nevar pārvērst par skaitli. Pēc noklusējuma tas ir labi: lietotājs saņems paziņojumu, ka programmā kaut kas nedarbojas, kā paredzēts.

Mēs vēlamies, lai katru reizi, kad lietotājs sāk šo programmu, viņam netiktu rādīta šī kļūda. Visticamāk "Text input" nav pareizais noklusējums teksta ievades lodziņam. Lai to novērstu, mainīsim vadīklas TextInput rekvizītu Noklusējuma uz:

Blank()

Kļūdas reklāmkarogs tiek parādīts ar

Hmm, tagad mums ir cita kļūda. Matemātiskās darbības ar blank, piemēram, dalīšana, pārvērtīs tukšo vērtību par nulli. Tāpēc rodas kļūda, dalot ar nulli. Lai to novērstu, ir jāizlemj, kā rīkoties šajā programmā šajā situācijā. Atbilde varētu būt rādīt blank, kad teksta ievade ir blank. To var paveikt, ietinot formu funkcijā IfError:

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

Nav parādīts kļūdas reklāmkarogs, kļūda tukšas vērtības dēļ ir aizstāta ar tukšu

Tagad kļūda tiek aizstāta ar derīgu vērtību, un kļūdas baneris netiek rādīts. Taču iespējams esat pārspīlējuši, mūsu izmantotā IfError ietver visas kļūdas, tostarp sliktas vērtības, piemēram, "hello" ievadīšanu. To var risināt, pielāgojot IfError tā, lai tā apstrādātu tikai dalīšanu ar nulli, bet atmestu pārējās kļūdas:

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

Kļūdas reklāmkarogs netiek parādīts, kļūda, kas radusies tieši dalīšanas ar nulli dēļ, ir aizstāta ar tukšu, pretējā gadījumā kļūda tiek atkārtoti izmesta

Tātad palaidīsim programmu un izmēģināsim citas vērtības.

Bez jebkādas vērtības, kā palaižot programmu, netiek rādīta atbilde, jo noklusējuma vērtība ir blank, taču tāpat netiek rādīta kļūda, jo IfError aizstāj dalīšanas ar nulli kļūdu.

Nav parādīta atbilde un nav kļūdas reklāmkaroga

Ja rakstot rezultātu 4, iegūstam gaidīto rezultātu 0,25:

Parādīts 0,25 un nav kļūdas reklāmkaroga

Ja ievadām ko neatļautu, piemēram, hello, saņemsim kļūdas baneri:

Nav parādīta vērtība un parādīts kļūdas reklāmkarogs par nespēju pārvērst

Šis ir vienkāršs ievada piemērs. Atkarībā no programmas vajadzībām kļūdas var apstrādāt dažādos veidos:

  1. Tā vietā, lai rādītu kļūdas baneri, mēs varējām etiķetes vadīklā ar formulu rādīt #Error. Lai ar pirmo argumentu paturētu aizvietotāju tipus, kas savietojami ar IfError, ir skaidri jāpārvērš skaitliskais rezultāts par teksta virkni ar funkciju Teksts.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Nav kļūdas reklāmkaroga, un tā vietā #Error tiek parādīts kā rezultāts
  2. Tā vietā, lai konkrēto instanci aplauztu ar IfError, mēs varējām rakstīt centralizētu App.OnError apdarinātāju. Mēs nevaram aizstāt virkni, kas tiek rādīta ar "#Error", jo kļūda jau ir notikumis, un App.On ir nodrošināts tikai, lai kontrolētu atskaišu rādīšanu.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Kļūdu izplatīšana

Kļūdas formulās rodas tikpat daudz cik programmā Excel. Piemēram, programmā Excel, ja šūnā A1 ir formula =1/0, tad A1 parādīs kļūdas vērtību #DIV0!:

Excel izklājlapa ar A1=1/0 un #DIV/0! parādīts šūnā

Ja šūnā A2 ir atsauce A1 ar tādu formulas vērtību kā, piemēram, =A1*2, tad kļūda izplatās arī šajā formulā:

Excel izklājlapa ar A2=A1*2 un #DIV/0! parādīts šūnā

Kļūda aizstāj vērtību, kas citādi būtu aprēķināta. Reizināšanai šūnā A2 nav rezultāta, tikai kļūda no dalīšanas ar A1.

Power Fx darbojas tādā pašā veidā. Parasti, ja kļūda tiek sniegta kā funkcijas vai operatora arguments, operācija netiks veikta un ievades kļūda atkārtosies operācijas rezultātā. Piemēram Mid( Text( 1/0 ), 1, 1 ) atgriezīs kļūdu Dalīts ar nulli, jo dziļākā kļūda atkārtojas funkcijā Teksts un Mid.

Kļūdas reklāmkarogs, kurā redzama nederīga darbība: dalīšana ar nulli

Parasti kļūdas neatkārtojas Power Apps vadīklu rekvizītos. Paplašināsim iepriekšējo piemēru ar papildu vadīklu, kas tiek rādīta, ja pirmās etiķetes Text rekvizīts ir kļūdas stāvoklis:

Otrajā etiķetes vadīklā nav parādīta kļūda

Ir labi, ka kļūdas netiek izplatītas vadīklā, jo sistēma ievadēs radīsies kļūdas visos vadīklas rekvizītos. Kļūda netiks zaudēta.

Vairākums funkciju un operatoru izmanto kārtulu "ienākošā kļūda, izejošā kļūda", taču ir daži izņēmumi. Funkcijas IsError, IsErrorOrBlank un IfError ir paredzētas darbam ar kļūdām, tāpēc tās var neatgriezt kļūdu pat, ja viena no tām tiek padota.

Kļūdu ievērošana

Kļūdas netiek ievērotas, kamēr nav lietota to vērtība.

Tāpēc funkcijas If un Select, iespējams, neatgriezīs kļūdu, ja tāda tiek nodota. Aplūkosim formulu If( false, 1/0, 3 ). Šajā formulā ir dalījuma ar nulli kļūda, bet, tā kā If neuzņem šo zaru false dēļ, Power Fx un Power Apps neziņos par kļūdu:

Nav kļūdas reklāmkarogs ar funkciju If etiķetes rekvizītā Teksts

Lietojot funkciju Set ar kļūdu, par kļūdu netiks ziņots brīdī, kad kļūda tiek piemērota mainīgajā. Power Apps gadījumā ir šāda formula AppOnStart, kas mainīgajam x piemēro dalījuma ar nulli kļūdu:

Nav parādīts kļūdas reklāmkarogs ar funkciju Set call in App.OnStart

Netiek ziņots par kļūdu, jo nav atsauces uz x. Taču brīdī, kad pievienojam etiķetes vadīklu un iestatām tās rekvizītu Teksts uz x, tiek rādīta kļūda:

Tiek rādīts kļūdas reklāmkarogs ar etiķetes vadīklu, kas atsaucas uz mainīgo x

Kļūdas formulā var novērot funkcijās IfError, IsError un IsErrorOrBlank. Izmantojot šīs funkcijas, var atgriezt alternatīvu vērtību, veikt alternatīvu darbību vai modificēt kļūdu, pirms tā tiek ievērota un par to tiek ziņots.

Ziņošana par kļūdām

Pēc tam, kad ir radusies kļūda, nākamajā darbībā tiek parādīts kļūdas ziņojums lietotājam.

Atšķirībā no programmas Excel ne vienmēr ir ērti parādīt kļūdas rezultātu, jo formulas rezultātā var tikt vadīts rekvizīts, piemēram, X un Y koordinātas vadīklā, kurai nav ērti parādīt tekstu. Katrs Power Fx viesošanas resurss kontrolē to, kā kļūdas galu galā tiek rādītas gala lietotājam, un to, cik lielā mērā šo procesu kontrolē veidotājs. Programmā Power Apps tiek rādīts kļūdas baneris un App.OnError tiek izmantota, lai kontrolētu to, kā tiek ziņots par kļūdu.

Jāņem vērā, ka App.OnError nevar aizstāt kļūdu tāpat, kā to var IfError. Kad tiek izpildīta App.OnError, kļūda jau ir notikusi un rezultāts ir izplatīts citās formulās. App.OnError kontrolē tikai to, kā par kļūdu tiek ziņots gala lietotājam, un nodrošina veidotākam āķi kļūdas reģistrēšanai, ja tas vajadzīgs.

Tvēruma mainīgie FirstError un AllErrors sniedz konteksta informāciju par kļūdu vai kļūdām. Tajā ir sniegta informācija par kļūdas veidu un gadījumiem, kad radās kļūda un kur tā tika ievērota.

Apturēšana pēc kļūdas

Rīcības formulas atbalsta darbību, pārveidojot datu bāzes un mainot stāvokli. Šīs formulas ļauj veikt vairāk nekā vienu darbību secībā, izmantojot ;saķēdēšanas operatoru (vai ;;, atkarībā no lokalizācijas).

Šādā gadījumā, piemēram, režģa vadīkla rāda, kas atrodas T tabulā. Katra poga atlasa izmaiņas tabulas statusā ar diviem Ielāpa izsaukumiem:

Animācija, kurā redzami divi ieraksti T tabulā, kas tiek atjaunināta ar nejaušiem skaitļiem pēc katras pogas noklikšķināšanas

Saķēdētas darbības formulā darbības neapstājas pēc pirmās kļūdas. Pārveidosim mūsu piemēru, lai padotu nederīgu rādītāja skaitli pirmajā Ielāpa izsaukumā. Otrais Ielāps turpinās neatkarīgi no iepriekšējās kļūdas. Par pirmo kļūdu tiek ziņots gala lietotājam, un tā Studio vadīklā tiek rādīta kā kļūda:

Animācija, kurā redzams tikai otrais ieraksts tabulā T, tiek atjaunināts ar nejaušiem skaitļiem pēc katras pogas klikšķa, pirmajam ierakstam radot kļūdu

IfError var izmantot, lai apturētu izpildi pēc kļūdas. Līdzīgi funkcijai If, trešais šīs funkcijas arguments nodrošina vietu, kurā izvietot darbības, kuras jāuzpilda tikai tad, ja nav kļūdu:

Animācija, kurā nav izmaiņu nevienā no T tabulas ierakstiem, jo IfError neļauj pabeigt otro darbību pēc kļūdas

Ja ar kļūdu saskaras vienā no ForAll iterācijām, pārējās iterācijas netiks apturētas. ForAll ir paredzēta, lai izpildītu katru iterāciju neatkarīgi, nodrošinot paralēlo izpildi. Kad ForAll ir izpildīta, tiks atgriezta kļūda, kas satur visas radušās kļūdas (pārbaudot AllErrors in IfError vai App.OnError).

Piemēram, šādas formulas dēļ ForAll atgriezīs divas kļūdas (dalījumam ar nulli Value no o, divreiz) un Collection būs trīs ieraksti (vai ja Value nav 0): [1, 2, 3].

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

Darbs ar vairākām kļūdām

Tā kā uzvedības formula var izpildīt vairākas darbības, tai var rasties arī vairākas kļūdas.

Pēc noklusējuma gala lietotājam ziņo par pirmo kļūdu. Šajā piemērā abi Ielāpa izsaukumi neizdosies, otrais ar dalījuma ar nulli kļūdu. Lietotājam tiek rādīta tikai pirmā kļūda (par rādītāju):

Pirmā indeksa kļūda, kas parādīta kļūdas reklāmkarogā, otrā kļūda netiek ziņota

IfError funkcija un App.OnError var piekļūt visām kļūdām, kas radušās ar tvēruma mainīgo AllErrors. Šajā gadījumā mēs varam iestatīt šo vērtību kā globālo mainīgo un apskatīt abas radušās kļūdas. Tās parādās tabulā tādā pašā secībā, kurā tās radās:

Kļūdu tveršana globālajā mainīgajā PatchErrors, kur mēs varam redzēt, ka abas kļūdas ir

Arī formulās, kas nav uzvedības formulas, var atgriezt vairākas kļūdas. Piemēram, izmantojot Patch funkciju ar jaunināmu ierakstu kopu, var tikt atgrieztas vairākas kļūdas, viena katram ierakstam, kas neizdodas.

Kļūdas tabulās

Kā redzējām iepriekš, kļūdas var glabāt mainīgajos. Kļūdas var iekļaut arī datu struktūrās, piemēram, tabulās. Tas ir svarīgi, lai kļūda jebkurā ierakstā nevarētu padarīt par nederīgu visu tabulu.

Piemēram, aplūkosim šo datu tabulas vadīklu programmā Power Apps:

Datu tabula, kurā redzama kļūda laukam Apgriezti otrādi ievadei 0, kā rezultātā tiek dalīts ar nulles kļūdu

Aprēķinam AddColumns ir radusies dalījuma ar nulli kļūda vienā no vērtībām. Šim vienam ierakstam kolonnai Reciprocal ir kļūdas vērtība (dalījums ar nulli), taču citiem ierakstiem nav un tie ir neskarti. IsError( Index( output, 2 ) ) atgriež aplamu, un IsError( Index( output, 2 ).Value ) atgriež patiesu.

Ja, filtrējot tabulu, rodas kļūda, viss ieraksts ir kļūda, bet rezultāts joprojām tiek atgriezts, lai lietotājs zinātu, ka tur radusies problēma.

Aplūkosim šo paraugu. Šajā sākotnējā tabulā nav kļūdu, bet filtrēšanas darbība rada kļūdu, ja Vērtība ir vienāda ar nulli.

Datu tabula, kurā redzamas kļūdas diviem ierakstiem, kurus nevarēja apstrādāt pēc filtra kritērijiem

Vērtības -5 un -3 ir pareizi izfiltrētas. Vērtības 0 izraisa filtra apstrādes kļūdu, tādēļ nav skaidrs, vai ieraksts ir jāiekļauj vai nav jāiekļauj tā rezultātā. Lai maksimizētu pārredzamību lietotājiem un palīdzētu veidotājiem atkļūdot, mēs sākotnējā vietā iekļaujam kļūdas ierakstu. Šajā gadījumā IsError( Index( output, 2 ) ) atgriež patiesu.

Datu avota kļūdas

Funkcijas, kas pārveido datus datu avotos, piemēram, Patch, Collect, Remove, RemoveIf, Update, UpdateIf un SubmitForm ziņo par kļūdām divos veidos:

  • Katra no šīm funkcijām operācijas rezultātā atgriezīs kļūdas vērtību. Kļūdas vasr noteikt ar IsError un aizstāt vai apspiest ar IfError and App.OnError, kā pierasts.
  • Pēc operācijas funkcija Kļūdas atgriezīs arī iepriekšējo operāciju kļūdas. Tas var būt noderīgi kļūdas ziņojuma parādīšanai veidlapas ekrānā, bez nepieciešamības tvert kļūdu stāvokļa mainīgajā.

Piemēram, šī formula pārbaudīs kļūdu no Collect un rādīs pielāgotu kļūdas ziņojumu:

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

Tāpat funkcija Kļūdas atgriež informāciju par pagātnes kļūdām palaišanas operāciju laikā. Tas var būt noderīgi kļūdas ziņojuma parādīšanai veidlapas ekrānā, bez nepieciešamības tvert kļūdu stāvokļa mainīgajā.

Kļūdu atkārtota izmešana

Dažkārt ir gaidāmas dažas iespējamas kļūdas, un tās var pilnībā ignorēt. IfError un App.OnError gadījumā, ja tiek noteikta kļūda, kuru vajadzētu padot nākamajam augstākajam apstrādātājam, to var atkārtoti izmest ar Error( AllErrors ).

Savu kļūdu izveide

Varat arī izveidot savas kļūdas, izmantojot funkciju Error.

Ja veidojat paši savas kļūdas, ir ieteicams izmantot vērtības, kas pārsniedz 1000, lai novērstu iespējamus konfliktus ar turpmākām sistēmas kļūdu vērtībām.

ErrorKind uzskaitījuma vērtības

ErrorKind uzskaitījums vērtība Apraksts
AnalysisError 18 Sistēmas kļūda. Radās problēma ar kompilatora analīzi.
BadLanguageCode 14 Tika izmantots nederīgs vai neatpazīts valodas kods.
BadRegex 15 Nederīga regulārā izteiksme. Pārbaudiet sintaksi, kas izmantota ar funkciju IsMatch, Match vai MatchAll
Konflikts 6 Ierakstā, kas tiek atjaunināts, avota ierakstā jau ir veiktas izmaiņas, un ir jāatrisina konflikts. Parasti tiek saglabātas visas lokālās izmaiņas, ieraksts tiek atsvaidzināts un no jauna tiek veiktas izmaiņas.
ConstraintViolated 8 Ieraksts nenokārtoja ierobežojuma pārbaudi serverī.
CreatePermission 3 Lietotājam attiecībā uz datu avotu nav ieraksta izveides atļaujas. Piemēram, tika izsaukta funkcija Collect.
DeletePermissions 5 Lietotājam attiecībā uz datu avotu nav ieraksta dzēšanas atļaujas. Piemēram, tika izsaukta funkcija Remove.
Div0 13 Dalīšana ar nulli.
EditPermissions 4 Lietotājam attiecībā uz datu avotu nav ieraksta izveides atļaujas. Piemēram, tika izsaukta funkcija Patch.
GeneratedValue 9 Vērtība serverī tika nodota laukam, ko automātiski aprēķina serveris.
InvalidFunctionUsage 16 Nederīgs funkcijas lietojums. Bieži viens vai vairāki funkcijas argumenti ir nepareizi vai tiek izmantoti nederīgā veidā.
FileNotFound 17 Krātuvi SaveData nevarēja atrast.
InsufficientMemory 21 Ierīces darbībai nepietiek atmiņas vai krātuves.
InvalidArgument 25 Funkcijai tika padots nederīgs arguments.
Iekšējais 26 Sistēmas kļūda. Kādai no funkcijām bija iekšēja problēma.
MissingRequired 2 Trūkst obligāta ieraksta lauka.
Tīkls 23 Radās problēma ar tīkla sakariem.
Nevienu 0 Sistēmas kļūda. Nav kļūdu.
Nav pielietojams 27 Nav pieejama neviena vērtība. Noder, lai tukšo vērtību, ko skaitliskos aprēķinos var uztvert kā nulli, no tukšām vērtībām, kuras varētu atzīmēt kā iespējamu problēmu, ja šī vērtība tiek izmantota.
NotFound 7 Ierakstu nevarēja atrast. Piemēram, ierakstu, kas tiks modificēts funkcijāPatch.
Netiek atbalstīts 20 Šis spēlētājs vai ierīce neatbalsta operāciju.
Skaitlisks 24 Skaitliska funkcija tika izmantota bez traucējumiem. Piemēram, Sqrt ar -1.
QuoteExceeded 22 Pārsniegta krātuves kvota.
ReadOnlyValue 10 Kolonna ir tikai lasāma, un to nevar modificēt.
ReadPermission 19 Lietotājam attiecībā uz datu avotu nav ieraksta lasīšanas atļaujas.
Sinhronizēt 1 Datu avots ziņoja par kļūdu. Papildinformāciju skatiet ziņojuma kolonnā.
Nezināms 12 Radās kļūda, bet nezināma tipa.
Validācija 11 Ierakstam netika veikta validācijas pārbaude.