Pastaba.
Prieigai prie šio puslapio reikalingas įgaliojimas. Galite bandyti prisijungti arba pakeisti katalogus.
Prieigai prie šio puslapio reikalingas įgaliojimas. Galite bandyti pakeisti katalogus.
Šiame straipsnyje aprašytas veikimas galimas tik tada, kai įjungta formulės lygio klaidų valdymo funkcija.
"Power Fx" palaiko formulės lygio klaidų apdorojimą. Ši funkcija pagal numatytuosius nustatymus įjungta visose naujose programose. Tačiau kai kuriose senesnėse programose jis gali būti išjungtas programos nustatymuose. Palikite šią funkciją įjungtą.
- Atidarykite drobės programą redagavimo režimu.
- Eikite į skirtuką "Nustatymai">Atnaujinimai>nutraukti .
- Įsitikinkite, kad išjungta parinktis Išjungti formulės lygio valdymą .
Daugiau informacijos rasite Įgalintų funkcijų valdymas.
Įvyksta klaidų. Tinklai neveikia, saugyklos prisipildo, atsiranda netikėtų reikšmių. Svarbu, kad jūsų logika ir toliau tinkamai veiktų susidūrus su galimomis problemomis.
Pagal numatytuosius nustatymus klaidų atsiranda programos formulėse ir apie jas pranešama programos galutiniam vartotojui. Tokiu būdu galutinis vartotojas žino, kad įvyko kažkas netikėto. Jie gali patys išspręsti problemą naudodami kitą įvestį arba pranešti apie problemą programos savininkui.
Kaip programų kūrėjas valdykite programos klaidas.
- Aptikti ir tvarkyti klaidą. Jei yra tikimybė, kad gali įvykti klaida, parašykite programos formules, kad aptiktumėte klaidos būseną, ir pakartokite operaciją. Galutiniam vartotojui nereikia rūpintis dėl klaidos, nes kūrėjas atsižvelgė į tokią galimybę. Užfiksuokite klaidą naudodami formulės funkcijas IfError, IsError ir IsErrorOrBlank .
- Pranešti apie klaidą. Jei klaida neapdorojama formulėje, kurioje su ja susidūrėte, klaida perkeliama į App.OnError apdorojimo programą. Klaidos pakeisti negalima, nes ji jau įvyko ir yra formulės skaičiavimų dalis. Bet galite naudoti App.OnError norėdami valdyti klaidos pateikimą galutiniam vartotojui, įskaitant klaidų ataskaitų teikimo sustabdymą. App.OnError taip pat suteikia bendrą užspringimo tašką pranešimams apie klaidas visoje programoje.
- Kurti ir iš naujo pateikti klaidą. Galiausiai galite aptikti klaidos sąlygą naudodami savo logiką, kuri yra būdinga jūsų programai. Naudokite Klaidos funkciją norėdami sukurti pasirinktines klaidas. Naudokite funkciją Error , kad iš naujo išmestumėte klaidą po užklausos IfError arba App.OnError.
Pradžia
Pradėkime nuo paprasto pavyzdžio.
- Sukurkite naują ekraną "Power Apps" drobės programoje.
- Įterpkite TextInput valdiklį. Numatytasis jo pavadinimas yra TextInput1.
- Įterpkite Žymos valdiklį.
- Nustatykite formulės Žymos valdiklio Teksto ypatybę
1/Value( TextInput1.Text )
Rodoma klaida, nes numatytasis valdiklio TextInput tekstas yra "Text input", kurio negalima konvertuoti į skaičių. Pagal numatytuosius nustatymus tai yra geras dalykas: galutinis vartotojas gauna pranešimą, kad programoje kažkas neveikia taip, kaip tikėtasi.
Akivaizdu, kad nenorite, kad klaida pasveikintų vartotoją kiekvieną kartą, kai jis paleidžia šią programą. Tikriausiai "Text input" vis tiek nėra tinkama numatytoji nuostata teksto įvesties laukeliui. Norėdami išspręsti šią problemą, pakeiskite valdiklio TextInput ypatybę Default į:
Blank()
Hmm, dabar matote kitą klaidą. Matematinės operacijos su tuščia, pvz., padalijimas, priverčia tuščią reikšmę iki nulio. Ši reikšmė sukelia padalijimo iš nulio klaidą. Norėdami išspręsti šią problemą, turite nuspręsti, koks elgesys tinka šiai situacijai šioje programoje. Atsakymas gali būti tuščias , kai teksto įvestis tuščia. Šį tikslą galite pasiekti apvyniodami formulę funkcija IfError :
IfError( 1/Value( TextInput1.Text ), Blank() )
Dabar klaida pakeičiama galiojančia reikšme ir klaidos reklamjuostė išnyksta. Tačiau galbūt peržengėte, jūsų naudotas IfError apima visas klaidas, įskaitant netinkamos reikšmės, pvz. "hello", . Šią problemą galite išspręsti sureguliuodami IfError , kad jis apdorotų dalijimą tik iš nulio ir iš naujo išmestų visas kitas klaidas:
IfError( 1/Value( TextInput1.Text ),
If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )
Taigi, paleiskite programą ir išbandykite keletą skirtingų reikšmių.
Kai nėra jokios reikšmės paleidus programą, nerodomas joks atsakymas, nes numatytoji reikšmė yra tuščia, tačiau klaida taip pat nerodoma, nes IfError pakeičia dalybos iš nulio klaidą.
Jei įvesite 4, gausite laukiamą rezultatą 0,25:
Ir jei įvesite ką nors neteisėto, pvz. hello, , gausite klaidos reklamjuostę:
Tai paprastas įvadinis pavyzdys. Klaidas galite tvarkyti įvairiais būdais, priklausomai nuo programos poreikių:
- Vietoj klaidos juostos galite rodyti "#Error" žymos valdiklyje su formule. Norėdami, kad pakeitimų tipai būtų suderinami su pirmuoju IfError argumentu, turite aiškiai konvertuoti skaitinį rezultatą į teksto eilutę naudodami funkciją Text .
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- Užuot apvynioję šį konkretų egzempliorių IfError, galite parašyti centralizuotą App.OnError apdorojimo programą. Negalite pakeisti rodomos eilutės "#Error", nes klaida jau įvyko, o "App.OnError " pateikiama tik valdymo ataskaitoms.
If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
Klaidų platinimas
Klaidos keliauja per formules panašiai kaip naudojant „Excel“. Pavyzdžiui, programoje "Excel", jei langelyje A1 yra formulė =1/0, tada A1 rodo klaidos reikšmę #DIV0!:
Jei langelis A2 nurodo A1 formulę, pvz. =A1*2, , klaida taip pat plinta per tą formulę:
Klaida pakeičia reikšmę, kurią kitu atveju apskaičiuotų formulė. Nėra dauginimo rezultato langelyje A2, tik dalybos klaida A1.
„Power Fx“ veikia taip pat. Apskritai, jei pateikiate klaidą kaip funkcijos ar operatoriaus argumentą, operacija nevykdoma. Įvesties klaida pereina kaip operacijos rezultatas. Pavyzdžiui, Mid( Text( 1/0 ), 1, 1 ) pateikia klaidą Padalijimas iš nulio, nes vidinė klaida pereina per funkciją Tekstas ir Vidurys :
Paprastai klaidos nepereina per "Power Apps" valdiklio ypatybes. Išplėskime ankstesnį pavyzdį kitu valdikliu, kuris rodomas, ar pirmosios žymos Text ypatybė yra klaidos būsena:
Gerai, kad klaidos neplinta per valdiklį, nes sistema pastebi klaidas įvesties į visas valdiklio ypatybes. Klaida neprarasta.
Daugelis funkcijų ir operatorių laikosi taisyklės „klaida įtraukiama, klaida pašalinama“, tačiau yra tam tikrų išimčių. Funkcijos IsError, IsErrorOrBlank ir IfError yra skirtos darbui su klaidomis, todėl jos gali nepateikti klaidos, net jei ji perduodama į jas.
Klaidų stebėjimas
"Power Fx" nepastebi klaidų, kol formulė nenaudoja klaidos reikšmės.
Todėl funkcijos If ir Select gali nepateikti klaidos, jei ji bus perduota. Apsvarstykite formulę If( false, 1/0, 3 ). Šioje formulėje yra padalijimo iš nulio klaida, bet kadangi funkcija If nenaudoja tos šakos dėl sąlygos false, "Power Fx" ir Power Apps nepraneša apie klaidą:
Naudojant funkciją Set su klaida, klaida nepranešama tuo metu, kai klaida įtraukiama į kintamąjį. Pavyzdžiui, Power Apps pateikiama formulė App.OnStart kuri į kintamąjį x įdeda paklaidą iš nulio:
Nepranešama apie jokią klaidą, nes nenurodoma x. Tačiau kai įtraukiate žymos valdiklį ir nustatote jo ypatybę Tekstas į x, rodoma klaida:
Formulės klaidas galite stebėti naudodami funkcijas IfError, IsError ir IsErrorOrBlank . Naudodami šias funkcijas galite grąžinti alternatyvią reikšmę, atlikti alternatyvius veiksmus arba modifikuoti klaidą, kol ji nebus pastebėta ir apie ją pranešta.
Pranešimas apie klaidas
Kai "Power Fx" pastebi klaidą, kitas veiksmas yra pranešti apie klaidą galutiniam vartotojui.
Skirtingai nei "Excel", ne visada yra patogi vieta klaidos rezultatui rodyti, nes formulės rezultatas gali paskatinti valdiklio ypatybę, pvz., X ir Y koordinates, kurios tekstui rodyti nėra. Kiekvienas „Power Fx“ pagrindinis kompiuteris valdo, kaip klaidos galiausiai parodomos galutiniam vartotojui ir kiek kūrėjas gali valdyti šį procesą. Power Apps rodoma klaidos reklamjuostė ir App.OnError naudojama valdyti, kaip pranešama apie klaidą.
Svarbu pastebėti, kad App.OnError negali pakeisti klaidos taip, kaip IfError. Tuo metu, kai vykdoma "App.OnError ", klaida jau įvyko, o rezultatas platinamas naudojant kitas formules. App.OnError tik kontroliuoja, kaip apie klaidą pranešama galutiniam vartotojui, ir suteikia kabliuką kūrėjui, kad jis galėtų užregistruoti klaidą, jei to pageidauja.
Aprėpties kintamieji FirstError ir AllErrors suteikia kontekstinės informacijos apie klaidą arba klaidas. Šiame kontekste pateikiama informacija apie klaidos rūšį, kur klaida atsirado ir kur ji buvo pastebėta.
Sustabdymas po klaidos
Veikimo formulės palaiko veiksmą, duomenų bazių modifikavimą ir būsenos keitimą. Šios formulės leidžia atlikti daugiau nei vieną veiksmą sekoje naudojant ; grandinės operatorių (arba ;; priklausomai nuo lokalės).
Tokiu atveju, pavyzdžiui, tinklelio valdiklis rodo, kas yra lentelėje T . Kiekvienas mygtuko spustelėjimas pakeičia būseną šioje lentelėje naudojant dvi Pataisos iškvietas:
Naudojant grandininio veikimo formulę, veiksmai nenutrūksta po pirmosios klaidos. Modifikuokime savo pavyzdį, kad per pirmąją Pataisos iškvietą būtų perduotas netinkamas rodyklės numeris. Antroji Pataisa tęsiasi nepaisant šios ankstesnės klaidos. Apie pirmąją klaidą pranešama galutiniam vartotojui ir „Studio“ valdiklyje rodoma kaip klaida:
Naudokite IfError , kad sustabdytumėte vykdymą po klaidos. Kaip ir funkcija Jei, trečiasis šios funkcijos argumentas pateikia vietą, kur galima įdėti veiksmus, kurie turėtų būti vykdomi, tik jei nėra klaidos:
Jei vienos iš "ForAll" iteracijų metu įvyksta klaida, likusios iteracijos nesibaigia. "ForAll" sukurta taip, kad kiekvieną iteraciją vykdytų savarankiškai, kad būtų galima vykdyti lygiagrečiai. Kai "ForAll" bus baigtas, pateikiama klaida, kurioje yra visos aptiktos klaidos (išnagrinėjus "AllErrors " programoje "IfError " arba "App.OnError").
Pavyzdžiui, pagal šią formulę ForAll pateikia dvi klaidas (dalijant iš nulio Value iš 0 du kartus) ir Collection turi tris įrašus (kai Value nėra 0): [1, 2, 3].
Clear( Collection );
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );
Darbas su keliomis klaidomis
Kadangi veikimo formulė gali vykdyti daugiau nei vieną veiksmą, joje taip pat gali įvykti daugiau nei viena klaida.
Pagal numatytuosius nustatymus programa praneša apie pirmąją klaidą galutiniam vartotojui. Šiame pavyzdyje abu pataisos iškvietimai nepavyksta, bet antrasis iškvietimas nepavyksta, padalijus iš nulio. Vartotojas mato tik pirmąją klaidą apie indeksą:
Funkcija IfError ir App.OnError gali pasiekti visas klaidas, su kuriomis susiduriama naudojant aprėpties kintamąjį AllErrors . Tokiu atveju galite nustatyti šį kintamąjį į visuotinį kintamąjį ir peržiūrėti abi klaidas. Jos rodomos lentelėje tokia pačia tvarka, kokia įvyko:
Neveikimo formulės taip pat gali pateikti kelias klaidas. Pavyzdžiui, naudojant Pataisos funkciją su įrašų paketu norint atnaujinti, galima pateikti kelias klaidas – po vieną kiekvienam nesėkmingam įrašui.
Klaidos lentelėse
Kaip matėte anksčiau, kintamųjų klaidas galite saugoti. Taip pat galite įtraukti klaidas duomenų struktūrose, pvz., lentelėse. Šis metodas yra svarbus, nes užtikrina, kad bet kurio įrašo klaida negali panaikinti visos lentelės.
Pavyzdžiui, apsvarstykite šį duomenų lentelės valdiklį "Power Apps":
Skaičiuojant AddColumns aptikta vienos iš reikšmių padalijimo iš nulio klaida. Tame įraše stulpelyje Abipusis yra klaidos reikšmė (dalyba iš nulio), bet kituose įrašuose viskas gerai.
IsError( Index( output, 2 ) ) Grąžina klaidingą ir IsError( Index( output, 2 ).Value ) teisingą reikšmę.
Jei filtruojant lentelę įvyksta klaida, klaida yra visas įrašas. Operacija vis tiek grąžina įrašą rezultate, kad galutinis vartotojas žinotų, kad kažkas ten buvo ir yra problema.
Žr. šį pavyzdį. Čia pradinėje lentelėje nėra klaidų, tačiau filtravimo veiksmas sukuria klaidą, kai Reikšmė lygi 0:
Reikšmės -5 ir -3 atfiltruotos tinkamai. Dėl 0 reikšmių įvyksta klaida apdorojant filtrą, todėl neaišku, ar įrašą reikia įtraukti į rezultatą, ar nereikia. Siekiant maksimaliai padidinti skaidrumą galutiniams vartotojams ir padėti kūrėjams derinti, operacija apima klaidos įrašą vietoj originalo. Šiuo atveju IsError( Index( output, 2 ) ) pateikia „true“.
Duomenų šaltinių klaidos
Funkcijos, kurios modifikuoja duomenis duomenų šaltiniuose, pvz., Pataisa, Surinkti, Pašalinti, RemoveIf, Atnaujinti, UpdateIf ir SubmitForm apie klaidas praneša dviem būdais:
- Kiekviena iš šių funkcijų pateikia klaidos reikšmę kaip operacijos rezultatą. Galite aptikti klaidas naudodami IsError ir pakeisti arba slopinti klaidas naudodami IfError ir App.OnError kaip įprasta.
- Po operacijos funkcija Klaidos taip pat grąžina ankstesnių operacijų klaidas. Toks elgesys gali būti naudingas rodant klaidos pranešimą formos ekrane, neužfiksuojant klaidos būsenos kintamajame.
Pavyzdžiui, ši formulė tikrina, ar nėra klaidos iš rinkimo , ir rodo pasirinktinį klaidos pranešimą:
IfError( Collect( Names, { Name: "duplicate" } ),
Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )
Klaidų funkcija taip pat pateikia informaciją apie vykdant operacijas įvykusias klaidas. Gali būti naudinga rodyti klaidą formos ekrane neužfiksuojant jos būsenos kintamajame.
Klaidų permetimas
Kartais tikitės galimų klaidų ir galite saugiai jų nepaisyti. Jei "IfError" ir "App.OnError" viduje aptinkama klaida, kuri turėtų būti perduota kitai aukštesnei apdorojimo programai, paleiskite ją iš naujo naudodami Error( AllErrors ).
Savų klaidų kūrimas
Taip pat galite sukurti savo klaidas naudodami funkciją Klaida .
Jei sukuriate savo klaidas, naudokite didesnes nei 1 000 reikšmes, kad išvengtumėte galimų konfliktų su būsimomis sistemos klaidų reikšmėmis.
ErrorKind išvardijimo reikšmės
| ErrorKind išvardijimas | Reikšmė | Aprašą |
|---|---|---|
| AnalysisError | 18 | Sistemos klaida. Yra problema su kompiliatoriaus analize. |
| BadLanguageCode | 14 | Buvo naudojamas netinkamas arba neatpažintas kalbos kodas. |
| BadRegex | 15 | Netinkama paprastoji išraiška. Patikrinkite sintaksę, naudojamą su IsMatch, Gretinti arba MatchAll funkcijomis. |
| Konfliktas | 6 | Naujinamas įrašas jau pakeistas šaltinyje, todėl turite išspręsti konfliktą. Įprastas sprendimas – įrašyti bet kokius vietinius pakeitimus, atnaujinti įrašą ir iš naujo pritaikyti pakeitimus. |
| ConstraintViolated | 8 | Įrašas neįveikė apribojimo patikros serveryje. |
| CreatePermission | 3 | Neturite teisės kurti duomenų šaltinio įrašo. Pvz., buvo iškviesta Rinkimo funkcija. |
| DeletePermissions | 5 | Neturite teisės naikinti duomenų šaltinio įrašo. Pvz., buvo iškviesta Pašalinimo funkcija. |
| Div0 | 13 | Dalyba iš nulio. |
| EditPermissions | 4 | Neturite teisės kurti duomenų šaltinio įrašo. Pvz., buvo iškviesta Pataisos funkcija. |
| GeneratedValue | 9 | Serveriui klaidingai perduota lauko, kurį serveris automatiškai apskaičiuoja, reikšmė. |
| InvalidFunctionUsage | 16 | Netinkamas funkcijos naudojimas. Dažnai vienas ar daugiau funkcijos argumentų yra neteisingi arba naudojami netinkamu būdu. |
| FileNotFound | 17 | SaveData saugyklos nepavyko rasti. |
| InsufficientMemory | 21 | Įrenginyje nepakanka atminties arba saugyklos vietos operacijai atlikti. |
| InvalidArgument | 25 | Funkcijai perduotas netinkamas argumentas. |
| Vidinis | 26 | Sistemos klaida. Yra vidinė problema su viena iš funkcijų. |
| MissingRequired | 2 | Trūksta būtino įrašo lauko. |
| Tinklas | 23 | Iškilo tinklo ryšio problema. |
| Joks | 0 | Sistemos klaida. Klaidos nėra. |
| Netaikoma | 27 | Nėra jokių reikšmių. Ši klaida naudinga norint atskirti tuščią reikšmę, kuri skaitiniuose skaičiavimuose gali būti traktuojama kaip nulis, nuo tuščių reikšmių, kurios turėtų būti pažymėtos kaip potenciali problema, jei naudojama reikšmė. |
| NotFound | 7 | Įrašo rasti nepavyko. Pvz., įrašas, kurį norite modifikuoti Pataisos funkcijoje. |
| NotSupported | 20 | Šis leistuvas arba įrenginys operacijos nepalaiko. |
| Skaitinis | 24 | Skaitinė funkcija buvo naudojama netinkamai. Pavyzdžiui, Sqrt su -1. |
| QuoteExceeded | 22 | Viršyta saugyklos kvota. |
| ReadOnlyValue | 10 | Stulpelis skirtas tik skaityti, jo modifikuoti negalima. |
| ReadPermission | 19 | Neturite teisės skaityti duomenų šaltinio įrašų. |
| Sinchronizuoti | 1 | Duomenų šaltinis pranešė apie klaidą. Daugiau informacijos rasite stulpelyje Pranešimas. |
| Nežinoma | 12 | Įvyko klaida, tačiau nežinoma, kokia. |
| Tikrinimas | 11 | Įrašas neįveikė patikros. |