Bendrinti naudojant


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.

  1. Sukurkite naują ekraną „Power Apps“ drobės programoje.
  2. Įterpkite TextInput valdiklį. Bus nustatytas numatytasis pavadinimas TextInput1.
  3. Įterpkite Žymos valdiklį.
  4. Nustatykite formulės Žymos valdiklio Teksto ypatybę
1/Value( TextInput1.Text )

Klaidos reklamjuostė su užrašu

Į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()

Rodoma klaidos reklamjuostė su užrašu

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() )

Nerodoma klaidos reklamjuostė, klaida dėl tuščios reikšmės buvo pakeista tuščia

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 ) ) )

Nerodoma klaidos reklamjuostė, klaida dėl padalijimo iš nulio buvo pakeista tuščia, kitaip klaida vėl išmesta

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ą.

Nerodomas atsakymas ir nėra klaidos reklamjuostės

Jei įvesime 4, gausime numatomą rezultatą 0,25:

Rodoma 0,25 ir nėra klaidų reklamjuostės

O jei įvesime ką nors neleistina, pvz., hello, tada gausime klaidos juostą:

Nerodoma jokia reikšmė ir rodoma klaidos reklamjuostė dėl nesugebėjimo konvertuoti

Tai paprastas įvadinis pavyzdys. Atsižvelgiant į programos poreikius, klaidas galima tvarkyti įvairiai:

  1. 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" )
    
    Nėra klaidos reklamjuostės, o vietoj to #Error rodomas kaip rezultatas
  2. 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!:

Excel skaičiuoklė su A1=1/0 ir #DIV/0! rodomas langelyje

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ą:

Klaidos reklamjuostė, rodanti netinkamą operaciją: padalijimas iš nulio

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:

Antrame etiketės valdiklyje klaida nerodoma

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š:

Nėra klaidos reklamjuostės su funkcija If etiketėje Teksto ypatybė

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:

Nėra klaidos reklamjuostės su Nustatyti funkcijų iškvietimą App.OnStart

Nepranešama apie jokią klaidą, nes nenurodoma x. Tačiau, kai įtraukiame žymos valdiklį ir nustatome jo Teksto ypatybę į x, klaida rodoma:

Rodoma klaidos reklamjuostė su etiketės valdikliu, nurodančiu kintamąjį x

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:

Animacija, rodanti, kad du įrašai lentelėje T atnaujinami atsitiktiniais skaičiais po kiekvieno mygtuko paspaudimo

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:

Animacija, rodanti tik antrąjį T lentelės įrašą, atnaujinamą atsitiktiniais skaičiais po kiekvieno mygtuko paspaudimo, o pirmasis įrašas sukelia klaidą

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:

Animacija, kurioje nerodomi nė vieno įrašo T lentelėje keitimai, nes

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ę):

Pirmoji indekso klaida rodoma klaidos reklamjuostėje, antroji klaida nepranešama

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:

Užfiksuokite klaidas į visuotinį kintamąjį PatchErrors, kur matome, kad yra abi klaidos

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“:

Duomenų lentelė, kurioje rodoma lauko Atvirkštinė klaida, kai įvestis yra 0, todėl gaunamas dalijimas iš nulinės klaidos

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:

Duomenų lentelė, kurioje rodomos dviejų įrašų klaidos, kurių nepavyko apdoroti taikant filtro kriterijus

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.