Klaidų apdorojimas
Pastaba.
Šiame straipsnyje aprašomas veikimo būdas galimas tik tada, kai įjungiama Formulės lygmens klaidų valdymo peržiūros funkcija, pasirinkus Parametrai>Būsimos funkcijos>Peržiūra. Daugiau informacijos: Funkcijų įjungimo 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. Tada galutinis vartotojas žino, kad įvyko kažkas netikėta – jis gali problemą išspręsti pats su kita įvestimi arba pranešti apie ją programos savininkui.
Būdamas programos kūrėjas galite valdyti savo programos klaidas:
- Klaidos aptikimas ir tvarkymas. Jei gali įvykti klaida, gali būti rašomos programos formulės, kad aptiktų klaidą ir atnaujintų veikimą. Galutiniam vartotojui nereikia rūpintis dėl klaidos, nes kūrėjas atsižvelgė į tokią galimybę. Tai atliekama naudojant formulės funkcijas IfError, IsError ir IsErrorOrBlank.
- Pranešimas apie klaidą. Jei klaida neapdorojama formulėje, kurioje įvyko, ji perduodama App.OnError apdorojimo programai. Čia klaidos nebegalima pakeisti, 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 įprasto klaidų ataskaitų pateikimo visoje programoje galimybes.
- Klaidos kūrimas ir permetimas. Galiausiai galite aptikti klaidą naudodami savo logiką – jūsų programai būdingą sąlygą. Naudokite Klaidos funkciją norėdami sukurti pasirinktines klaidas. Klaidos funkcija taip pat naudojama klaidai permesti po to, kai gaunama informacija IfError arba App.OnError.
Darbo pradžia
Pradėkime nuo paprasto pavyzdžio.
- Sukurkite naują ekraną „Power Apps“ drobės programoje.
- Įterpkite TextInput valdiklį. Bus nustatytas numatytasis pavadinimas TextInput1.
- Įterpkite Žymos valdiklį.
- Nustatykite formulės Žymos valdiklio Teksto ypatybę
1/Value( TextInput1.Text )
Įvyksta klaida, nes TextInput valdiklio numatytasis tekstas yra "Text input"
– jo negalima konvertuoti į skaičių. Paprastai tai yra gerai: galutinis vartotojas gaus pranešimą, kad programoje kas nors neveikia taip, kaip tikėjotės.
Žinoma, nenorime, kad klaida būtų kiekvieną kartą vartotojui paleidus šią programą. Tikriausiai "Text input"
vis tiek nėra tinkama numatytoji nuostata teksto įvesties laukeliui. Norėdami tai pataisyti pakeiskime TextInput valdiklio Numatytosios nuostatos ypatybę:
Blank()
O dabar įvyko kita klaida. Matematiniai veiksmai su tuščia reikšme, pvz., dalyba, pavers tuščią reikšmę nuliu. Dabar tai sukels dalybos iš nulio klaidą. Norėdami tai pataisyti turime nuspręsti dėl tinkamo programos veikimo šioje situacijoje. Gali būti, kad atsakymas yra tuščia reikšmė, kai teksto įvestis yra tuščia reikšmė. Galime tai atlikti įtraukę į savo formulę IfError funkciją:
IfError( 1/Value( TextInput1.Text ), Blank() )
Dabar klaida pakeičiama tinkama reikšme, o klaidos juosta išnyksta. Bet galbūt prašovėme, nes IfError apima visas klaidas, įskaitant blogos reikšmės, pvz., "hello"
, įvedimą. Tai galime išspręsti pritaikę IfError apdoroti dalybą iš nulio tik permetę visas kitas klaidas:
IfError( 1/Value( TextInput1.Text ),
If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )
Todėl paleiskime programą ir išmėginkime kitokias reikšmes.
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 įvesime 4, gausime numatomą rezultatą 0,25:
O jei įvesime ką nors neleistina, pvz., hello
, tada gausime klaidos juostą:
Tai paprastas įvadinis pavyzdys. Atsižvelgiant į programos poreikius, klaidas galima tvarkyti įvairiai:
- Vietoj klaidos juostos formulės žymos valdiklyje gali būti rodoma "#Error". Kad pakaitiniai tipai būtų suderinami su pirmuoju IfError argumentu, mums reikia aiškiai konvertuoti skaitinį rezultatą į teksto eilutę su Teksto funkcija.
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- Užuot susieję šį specialų egzempliorių su IfError, galime parašyti centralizuotą App.OnError apdorojimo programą. Negalime pakeisti eilutės, rodomos su „#Error“, nes klaida jau įvyko, o App.OnError pateikiama tik pranešimui valdyti.
If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
Klaidų platinimas
Klaidos keliauja per formules panašiai kaip naudojant „Excel“. Pavyzdžiui, jei programos „Excel“ langelyje A1
yra formulė =1/0
, tada A1 rodys klaidos reikšmę #DIV0!
:
Jei langelis A2
nurodo A1
su formule, pvz., =A1*2
, tada klaida platinama ir toje formulėje:
Klaida pakeičia reikšmę, kuri kitu atveju būtų apskaičiuojama. Nėra dauginimo rezultato langelyje A2
, tik dalybos klaida A1
.
„Power Fx“ veikia taip pat. Apskritai, jei klaida pateikiama kaip funkcijos arba operatoriaus argumentas, operacija nebus atliekama, o įvesties klaida praeis kaip operacijos rezultatas. Pavyzdžiui, Mid( Text( 1/0 ), 1, 1 )
pateiks dalybos iš nulio klaidą, nes giliausia klaida praeina Teksto funkciją ir Mid funkciją:
Paprastai klaidos nepereis „Power Apps“ valdiklio ypatybių. Išplėskime ankstesnį pavyzdį naudodami papildomą valdiklį, kuris rodo, ar pirmosios žymos Text
ypatybė yra klaidos būsena:
Gerai, kad klaidos nepereina valdiklio, nes sistema stebės klaidas įvedant visų valdiklių ypatybes. Klaida nebus pamesta
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 pritaikytos dirbti su klaidomis, todėl gali nepateikti klaidos, net jeigu kokia nors pasitaiko.
Klaidų stebėjimas
Klaidos nestebimos, kol naudojama jų reikšmė.
Dėl šios priežasties funkcijos Jei ir Pasirinkti taip pat gali nepateikti pasitaikiusios klaidos. Apsvarstykite formulę If( false, 1/0, 3 )
. Šioje formulėje yra dalybos iš nulio klaida, bet If
neapims šios šakos, nes false
, „Power Fx“ ir „Power Apps“ apie klaidą nepraneš:
Naudojant funkciją Nustatyti su klaida, apie klaidą nebus pranešama įtraukiant klaidą į kintamąjį. Pavyzdžiui, naudojant „Power Apps“ yra formulė App.OnStart, kuri įtraukia dalybos iš nulio klaidą į kintamąjį x
:
Nepranešama apie jokią klaidą, nes nenurodoma x
. Tačiau, kai įtraukiame žymos valdiklį ir nustatome jo Teksto ypatybę į x
, klaida rodoma:
Galite stebėti formulės klaidas naudodami funkcijas IfError, IsError ir IsErrorOrBlank. Naudodami šias funkcijas galite grąžinti pakaitinę reikšmę, atlikti pakaitinį veiksmą arba modifikuoti klaidą, kol ji nepastebėta ir apie ją nepranešta.
Pranešimas apie klaidas
Kai pastebima klaida, kitas veiksmas yra pranešti apie ją galutiniam vartotojui.
Skirtingai nei „Excel“, ne visada yra patogu parodyti klaidos rezultatą, nes formulės rezultate gali būti valdiklio X ir Y koordinačių – nėra patogios vietos visam tekstui parodyti. Kiekvienas „Power Fx“ pagrindinis kompiuteris valdo, kaip klaidos galiausiai parodomos galutiniam vartotojui ir kiek kūrėjas gali valdyti šį procesą. „Power Apps“ rodoma klaidos juosta, o App.OnError naudojama klaidos pranešimui valdyti.
Svarbu pastebėti, kad App.OnError negali pakeisti klaidos taip, kaip IfError. Kai vykdoma App.OnError, klaida jau įvykusi, o rezultatas platinamas per kitas formules. App.OnError tik kontroliuoja, kaip apie klaidą pranešama galutiniam vartotojui, ir suteikia kūrėjui galimybę, jei reikia, klaidą užregistruoti.
Aprėpties kintamieji FirstError ir AllErrors suteikia kontekstinės informacijos apie klaidą arba klaidas. Tai suteikia informacijos apie klaidos tipą, kilmę ir aptikimo vietą.
Sustabdymas po klaidos
Veikimo formulės palaiko veiksmą, duomenų bazių modifikavimą ir būsenos keitimą. Šios formulės leidžia iš eilės atlikti daugiau nei vieną veiksmą naudojant ;
sujungimo į grandinę operatorių (arba ;;
atsižvelgiant į lokalę).
Šiuo atveju, pvz., tinklelio valdiklis rodo, kas yra T
lentelėje. 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:
IfError galima naudoti norint po klaidos sustabdyti vykdymą. 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 per vieną iš ForAll pakartojimų įvyksta klaida, likę pakartojimai nebus sustabdyti. ForAll sukurta, kad kiekvienas pakartojimas būtų vykdomas nepriklausomai – įmanomas lygiagretus vykdymas. Kai ForAll atlikta, bus pateikta klaida su visomis įvykusiomis klaidomis (patikrinant AllErrors IfError arba App.OnError).
Pavyzdžiui, nurodyta formulė lems ForAll su dviem klaidomis (Value
dalyba iš 0, du kartus), o Collection
bus trys įrašai (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 apie pirmąją klaidą pranešama galutiniam vartotojui. Šiame pavyzdyje abi Pataisos iškvietos bus nesėkmingos – antroji su dalybos iš nulio klaida. Vartotojui rodoma tik pirmoji klaida (apie rodyklę):
IfError funkcija ir App.OnError gali pasiekti visas įvykusias klaidas naudojant AllErrors aprėpties kintamąjį. Šiuo atveju galime nustatyti į visuotinį kintamąjį ir peržiūrėti abi įvykusias klaidas. Jos rodomos lentelėje tokia pačia tvarka, kokia įvyko:
Kelios klaidos gali būti pateiktos ir ne veikimo formulėse. 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ėme anksčiau, klaidos gali būti išsaugotos kintamuosiuose. Klaidas taip pat galima įtraukti į duomenų struktūras, pvz., lenteles. Tai svarbu, kad klaida bet kuriame įraše nesugadintų visos lentelės.
Pavyzdžiui, atsižvelkite į šį duomenų lentelės valdiklį „Power Apps“:
Atliekant AddColumns skaičiavimus, įvyko vienos iš reikšmių dalybos 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 ) )
pateikia „false“, o IsError( Index( output, 2 ).Value )
pateikia „true“.
Jei filtruojant lentelę įvyksta klaida, visas įrašas yra klaida, bet jis vis tiek pateikiamas rezultate, kad galutinis vartotojas žinotų, jog kažkas įvyko 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. Norėdami maksimizuoti skaidrumą galutiniams vartotojams ir padėti kūrėjams derinti, įtraukiame klaidos įrašą vietoj pradinio. Š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ų kaip operacijos rezultatą pateiks klaidos reikšmę. Klaidas įprastai galima aptikti naudojant IsError ir pakeisti arba nerodyti naudojant IfError ir App.OnError.
- Atlikus šią operaciją, funkcija Errors taip pat pateiks ankstesnių operacijų klaidas. Tai gali būti naudinga norint parodyti klaidos pranešimą formos ekrane neužfiksuojant jos būsenos kintamajame.
Pavyzdžiui, šioje formulėje naudojant Surinkti bus patikrinta, ar nėra klaidos, ir parodytas pasirinktinis klaidos pranešimas:
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 klaidų tikimasi ir jų galima saugiai nepaisyti. Naudojant IfError ir App.OnError, jei aptinkama klaida ir ji turi būti perduota kitai aukštesnei apdorojimo programai, ją galima permesti naudojant Error( AllErrors )
.
Savų klaidų kūrimas
Taip pat galite sukurti savo klaidų naudodami Klaidos funkciją.
Jei kuriate savo klaidas, rekomenduojama naudoti didesnes nei 1000 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 | Vertė | Aprašą |
---|---|---|
AnalysisError | 18 | Sistemos klaida. Kilo problema dėl kompiliatoriaus analizės. |
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 | Atnaujinamas įrašas jau pakeistas šaltinyje, todėl konfliktą reikia išspręsti. Į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 | Vartotojas neturi kurti duomenų šaltinio įrašo teisės. Pvz., buvo iškviesta Rinkimo funkcija. |
DeletePermissions | 5 | Vartotojas neturi panaikinti duomenų šaltinio įrašo teisės. Pvz., buvo iškviesta Pašalinimo funkcija. |
Div0 | 13 | Dalyba iš nulio. |
EditPermissions | 4 | Vartotojas neturi kurti duomenų šaltinio įrašo teisės. Pvz., buvo iškviesta Pataisos funkcija. |
GeneratedValue | 9 | Lauko, kurį automatiškai apskaičiavo serveris, reikšmė buvo klaidingai perduota į serverį. |
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 | Operacijai atlikti nepakanka įrenginio atminties arba saugyklos vietos. |
InvalidArgument | 25 | Funkcijai perduotas netinkamas argumentas. |
Vidinis | 26 | Sistemos klaida. Vienoje iš funkcijų iškilo vidinė problema. |
MissingRequired | 2 | Trūko reikiamo įrašo lauko. |
Tinklas | 23 | Kilo problema dėl tinklo ryšių. |
Joks | 0 | Sistemos klaida. Klaidos nėra. |
Netaikoma | 27 | Nėra jokių reikšmių. Naudinga atskirti tuščią reikšmę, kurią skaitiniuose skaičiavimuose galima naudoti kaip nulinę reikšmę, nuo tuščių reikšmių, kurios turėtų būti pažymėtos kaip galima problema, jei reikšmė naudojama. |
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 | Vartotojas neturi skaityti duomenų šaltinio įrašo teisės. |
Sinchronizuoti | 1 | Duomenų šaltinis pranešė apie klaidą. Daugiau informacijos rasite stulpelyje Pranešimas. |
Nežinoma | 12 | Įvyko klaida, tačiau nežinoma, kokia. |
Patikrinimas | 11 | Įrašas neįveikė patikros. |