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.OnError nodrošina arī kopīgu aizrīšanās punktu kļūdu ziņošanai visā lietotnē.
- 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.
- Izveidojiet jaunu ekrānu Power Apps pamatnes programmā.
- Ievadiet vadīklu TextInput. Pēc noklusējuma tiek lietots nosaukums TextInput1.
- Ievietojiet vadīklu Etiķete.
- Iestatiet vadīklas Etiķete rekvizītu Teksts formulā
1/Value( TextInput1.Text )
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()
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() )
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 ) ) )
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.
Ja rakstot rezultātu 4, iegūstam gaidīto rezultātu 0,25:
Ja ievadām ko neatļautu, piemēram, hello
, saņemsim kļūdas baneri:
Šis ir vienkāršs ievada piemērs. Atkarībā no programmas vajadzībām kļūdas var apstrādāt dažādos veidos:
- 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" )
- 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!
:
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ā:
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.
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:
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:
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:
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:
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 āķi, lai veidotājs varētu reģistrēt kļūdu, ja nepieciešams.
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:
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:
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:
Ja ar kļūdu saskaras vienā no ForAll iterācijām, pārējās iterācijas netiks apturētas. ForAll ir izstrādāts, lai katru iterāciju izpildītu neatkarīgi, ļaujot veikt paralēlu 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):
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:
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:
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ž nepatiesu un IsError( Index( output, 2 ).Value )
atgriež TRUE.
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.
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. |