Jaa


Virheen käsittely

Muistiinpano

Tässä artikkelissa kuvattu toiminnallisuus on käytettävissä vain, kun Kaavatason virheiden hallinta -esiversio-ominaisuus on käytössä kohdasta Asetukset>Tulevat ominaisuuder>Esiversio. Lisätietoja: Käytössä olevien ominaisuuksien hallinta

Virheitä tapahtuu. Verkot kaatuvat, tallennustila täyttyy, odottamattomia arvoja virtaa sisään. On tärkeää, että logiikka toimii edelleen oikein mahdollisten ongelmien varalta.

Oletusarvon mukaan virheet virtaavat sovelluksen kaavojen läpi ja raportoidaan sovelluksen loppukäyttäjälle. Tällä tavalla käyttäjä tietää, että jotakin odottamatonta on tapahtunut, hän voi ehkä korjata ongelman itse eri tavoin tai ilmoittaa ongelmasta sovelluksen omistajalle.

Sovelluksen luojana voit hallita sovelluksessasi virheitä:

  • Virheen havaitseminen ja käsittely. Jos virhe voi ilmetä, sovelluksen kaavat voidaan kirjoittaa virheen tunnistamista varten ja toiminnon uudelleenyritystä varten. Käyttäjän ei tarvitse olla huolissaan siitä, että tapahtui virhe, koska tekijä on ottanut mahdollisuuden huomioon. Tämä tehdään kaavan funktioilla IfError, IsError ja IsErrorOrBlank.
  • Virheen raportointi. Jos virhettä ei käsitellä kaavassa, jossa se kohdattiin, virhe kuplataan App.OnError-käsittelijään. Tässä virhettä ei voi enää korvata, koska se on jo tapahtunut, ja se on osa kaavalaskelmia. Voit kuitenkin käyttää funktiota App.OnError hallitaksesi sitä, kuinka virhe raportoidaan loppukäyttäjälle, mukaan lukien virheenraportoinnin ohittaminen. App.OnError tarjoaa myös yleisen pullonkaulapisteen virheraportointiin koko sovelluksessa.
  • Virheen luominen ja uudelleentuottaminen. Lopuksi saatat huomata virhetilan, joka liittyy omaan logiikkaasi, ehdon, joka liittyy sovellukseen. Error-funktion avulla voit luoda mukautettuja virheitä. Funktiota Error käytetään myös luomaan virhe uudestaan sen jälkeen, kun sitä on kyselty funktiossa IfError tai App.OnError.

Aloitus

Seuraavassa on yksinkertainen esimerkki.

  1. Luo uusi näyttö pohjaan perustuvassa Power Apps -sovelluksessa.
  2. Lisää TextInput-ohjausobjekti. Oletusarvona on nimi TextInput1.
  3. Lisää Selite-ohjausobjekti.
  4. Määritä Text-ominaisuus kaavan Selite-ohjausobjektille
1/Value( TextInput1.Text )

Text input -tekstin sisältävän tekstinsyötön ohjausobjektin virhepalkki, jonka mukaan arvoa ei voi muuttaa numeroksi.

Meillä on virhe, koska oletusteksti TextInput-ohjausobjektissa on "Text input", jota ei voi muuttaa numeroksi. Tämä on oletusarvoisesti hyvä asia: loppukäyttäjä saa ilmoituksen siitä, että jokin ei toimi odotetusti sovelluksessa.

On selvää, että emme halua, että virhe tervehtii käyttäjää aina, kun hän käynnistää tämän sovelluksen. Todenneköisesti "Text input" ei ole oikea oletusarvo tekstinsyöttöruudulle. Korjataan tämä muuttamalla Oletus-ominaisuus TextInput-ohjausobjektissa:

Blank()

Virhepalkissa on teksti: jako nollalla

Nyt meillä on toinen virhe. Matemaattiset operaatiot, joissa on tyhjä, kuten jaot, pakottavat tyhjän arvon nollaksi. Tämä aiheuttaa nyt nollalla jako -virheen. Tämän korjaamiseksi on päätettävä, mikä on oikea toimintatapa tässä sovelluksessa. Vastaus voi olla tyhjän näyttäminen kun tekstinsyöttö on tyhjä . Tämän voi tehdä paketoimalla kaavan IfError-funktiolla:

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

Ei virhepalkkia; tyhjästä arvosta johtuva virhe on korvattu tyhjällä

Virhe korvataan nyt kelvollisella arvolla ja virhepalkki on poissa. Olemme saattaneet ylikompensoida, sillä IfError, jota käytimme, kattaa kaikki virheet, myös väärän arvon, kuten "hello" kirjoittamisen. Tähän voidaan puuttua hienosäätämällä IfError-funktiota käsittelemään vain nollallajakotapaus ja luomaan uudelleen muut virheet:

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

Ei virhepalkkia; virheen syy on jako nollalla ja se on korvattu tyhjällä, muutoin virhe annetaan uudelleen

Suoritetaan siis sovellus ja kokeillaan joitakin eri arvoja.

Jos mitään arvoa ei ole, kuten sovelluksen käynnistyessä, vastausta ei näytetä, koska oletusarvo on tyhjä, mutta virhettä ei myöskään näytetä, koska IfError korvaa nollallajakovirheen.

Vastausta ei näytetä eikä virhepalkkia

Jos kirjoitamme 4, saadaan odotettu tulos 0,25:

0,25 näkyy, ei virhepalkkia

Jos kirjoitamme jotain väärää, kuten hello, saamme virhepalkin:

arvo ei näy ja virhepalkki ilmoittaa, ettei hello-sanaa voi muuntaa numeroksi

Tämä on yksinkertainen johdantoesimerkki. Virheiden käsittely voidaan tehdä monella eri tavalla sovelluksen tarpeiden mukaan:

  1. Virhepalkin sijasta olisimme voineet näyttää "#Error" kaavan seliteohjausobjektissa. Jos haluat, että korvaavat tyypit ovat yhteensopivia IfError-funktion ensimmäisen argumentin kanssa, on numeerinen vastaus erikseen muunnettava tekstimerkkijonoksi Text-funktion avulla.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    ei virhepalkkia ja sen sijaan tuloksena näytetään #Error
  2. Tämän esiintymän IfError-funktiolla paketoimisen asemesta olisimme voineet kirjoittaa keskitetyn App.OnError-käsittelijän. Näytettyä merkkijonoa ei voida korvata merkkijonolla "#Error", koska virhe on jo tapahtunut ja App.OnError on annettu vain ohjausobjektin raportoinnille.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Virheen levitys

Virheet virtaavat kaavojen läpi niin kuin Excelissäkin. Jos solussa A1 on esimerkiksi kaava =1/0, A1 näyttää virhearvon #DIV0!:

Excel-laskentataulukon solussa näkyy A1=1/0 ja #DIV/0!

Jos solu A2 viittaa A1 esimerkiksi kaavalla =A1*2, virhe leviää myös kaavan kautta:

Excel-laskentataulukon solussa näkyy A2=A1*2 ja #DIV/0!

Virhe korvaa arvon, joka olisi muutoin laskettu. Solussa A2 ei ole kertolaskua , vain jakovirhe kohdasta A1.

Power Fx toimii samalla tavalla. Jos funktiolle tai operaattorille annetaan argumenttina virhe, toimintoa ei yleensä tehdä, ja syötevirhe tapahtuu toiminnon tuloksena. Esimerkiksi, Mid( Text( 1/0 ), 1, 1 ) palauttaa nollallajakovirheen, koska sisin virhe kulkee Text-funktion ja Mid-funktion kautta:

Virhepalkissa näkyy virheellinen toiminto: jako nollalla

Yleensä virheet eivät kulje Power Apps -ohjausobjektin ominaisuuksien läpi. Laajennetaan edellistä esimerkkiä ohjausobjektin avulla, joka tulee näkyviin, jos ensimmäisen otsikon Text-ominaisuuden tila on virhetila:

Toisessa seliteohjausobjektissa ei näy virhettä

On hyvä, että virheet eivät leviä ohjausobjektiin, koska järjestelmä havaitsee syötteiden virheitä kaikissa ohjausobjektien ominaisuuksissa. Virhettä ei menetetä.

Useimmat toiminnot ja operaattorit noudattavat "error in, error out" -sääntöä, mutta joitakin poikkeuksia on olemassa. Funktiot IsError, IsErrorOrBlank ja IfError on suunniteltu toimimaan virheiden kanssa, joten ne eivät välttämättä palauta virhettä, vaikka niille välitettäisiin sellainen.

Virheiden tarkastelu

Virheitä ei havaita, ennen kuin niiden arvo on käytössä.

Siksi funktiot If jaSelect eivät välttämättä myöskään palauta virhettä, jos niille välitetään sellainen. Tarkastele kaavaa If( false, 1/0, 3 ). Tässä kaavassa on nollallajakovirhe, mutta koska If ei käytä kyseistä haaraa, koska false, Power Fx ja Power Apps eivät raportoi virhettä:

Ei virhepalkkia, jossa If-funktio selitteen tekstiominaisuudessa

Käytettäessä funktiota Set virheellä, virhettä ei raportoida siinä vaiheessa, kun virhe sijoitetaan muuttujaan. Esimerkiksi Power Appsissa on kaava App.OnStart, joka sijoittaa nollallajakovirheen muuttujaan x:

Ei virhepalkkia, jossa Set-funktion kutsu App.OnStart-kaavassa

Virheestä ei raportoida, koska kohteeseen x ei viitata. Heti, kun lisäämme seliteohjausobjektin ja määritämme sen Text-ominaisuudeksi x, virhe kuitenkin näytetään:

Virhepalkki, jossa seliteohjausobjekti viittaa muuttujaan x

Voit tarkastella virheitä kaavassa funktioilla IfError, IsError ja IsErrorOrBlank. Näiden toimintojen avulla voit palauttaa vaihtoehtoisen arvon, tehdä vaihtoehtoisen toiminnon tai muokata virhettä, ennen kuin se havaitaan ja raportoidaan.

Virheiden raportointi

Kun virhe on havaittu, seuraava vaihe on raportoida virheestä käyttäjälle.

Toisin kuin Excelissä, virhetuloksen näyttäminen ei aina ole helppoa, koska kaavan tuloksena saadaan ohjausobjektin ominaisuus, kuten X- ja Y-koordinaatit, joihin ei ole kätevää paikkaa, jossa tekstiä näytetään. Kukin Power Fx -isäntä määrittää, miten virheet näytetään lopuksi käyttäjälle, ja kuinka paljon tekijän on hallittava tätä prosessia. Power Appsissa näytetään virhepalkki ja funktiota App.OnError käytetään ohjaamaan virheen raportointia.

On tärkeää huomata, että App.OnError ei voi korvata virhettä samalla tavalla kuin IfError. Kun App.OnError suoritetaan, virhe on jo tapahtunut, ja tulos on levitetty muiden kaavojen kautta. App.OnError ohjaa vain sitä, miten virheestä ilmoitetaan loppukäyttäjälle, ja tarjoaa koukun, jonka avulla tekijä voi kirjata virheen haluttaessa.

Vaikutusaluemuuttujat FirstError ja AllErrors antavat kontekstitietoja virheestä tai virheistä. Tässä on tietoja virheen tyypistä ja siitä, mistä virhe on peräisin ja mistä virhe ilmeni.

Pysähtyminen virheen jälkeen

Käyttäytymiskaavat tukevat toimia, tietokantojen muokkaamista ja tilan muuttumista. Nämä kaavat mahdollistavat useamman toiminnon suorittamisen ketjussa ; ketjutusoperaattorin avulla (tai ;; kielialueesta riippuen).

Tässä tapauksessa esimerkiksi ruudukon ohjausobjekti näyttää, mitä taulukossa T on. Kukin painikkeen valinta muuttaa tilaa tässä taulukossa kahdella Patch-kutsulla:

Animaatio näyttää kahden T-taulukon tietueen päivittämisen satunnaisilla luvilla aina napsautuksen jälkeen

Ketjutetussa toimintokaavassa toiminnot eivät pysähdy ensimmäisen virheen jälkeen. Muutetaan esimerkkiämme niin, että ensimmäiselle Patch-kutsulle annetaan virheellinen indeksinumero. Toinen Patch jatkaa aiemmasta virheestä huolimatta. Ensimmäinen virhe raportoidaan käyttäjälle ja näytetään virheenä ohjausobjektin Studiossa:

Animaatiossa näkyy vain toisen T-taulukon tietueen päivitys satunnaisluvuilla kunkin napsautuksen jälkeen; ensimmäinen tietue aiheutti virheen

IfError-funktiota voidaan käyttää pysäyttämään suoritus virheen jälkeen. Samoin kuin funktiollla If, kolmas tämän funktion argumentti tarjoaa paikan, johon voidaan laittaa toimintoja, jotka on suoritettava vain, jos virhettä ei tapahtunut:

Animaatiossa näytetään, ettei kummassakaan T-taulukon tietueessa ole muutoksia, koska IfError estää toisen toiminnon suorittamisen virheen jälkeen

Jos yhden funktion ForAll toiston jälkeen havaitaan virhe, loput toistot eivät pysähdy. ForAll on suunniteltu suorittamaan jokainen iteraatio itsenäisesti, mikä mahdollistaa rinnakkaisen suorituksen. Kun ForAll on valmis, palautetaan virhe, joka sisältää kaikki löydetyt virheet (tarkastelemalla parametria AllErrors funktiossa IfError tai App.OnError).

Esimerkiksi seuraavan kaavan johdosta ForAll palauttaa kaksi virhettä (nollalla jakamiselle kohdassa Value arvolla 0 kahdesti) ja kokoelmalla Collection on kolme tietuetta (kun Value ei ole 0): [1, 2, 3].

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

Useiden virheiden parissa työskenteleminen

Koska käyttäytymiskaava voi suorittaa useita toimintoja, siinä voi olla myös useita virheitä.

Oletusarvoisesti ensimmäinen virhe raportoidaan loppukäyttäjälle. Tässä esimerkissä molemmat Patch-kutsut epäonnistuvat, toinen nollallajakovirheellä. Käyttäjälle näytetään vain ensimmäinen virhe (tietoja indeksistä):

Virhepalkissa näkyy ensimmäinen indeksivirhe, toista virhettä ei raportoida

Funktio IfError ja App.OnError voivat käyttäää kaikkia vaikutusaluemuuttujan AllErrors löytämiä virheitä. Tässä tapauksessa voidaan määrittää yleinen muuttuja ja tarkastella molempia virheitä. Ne ovat taulukossa siinä järjestyksessä, jossa ne löydettiin:

Virheiden sieppaaminen yleiseen PatchErrors-muuttujaan, jossa molemmat virheet näkyvät

Myös ei-toimintokaavat voivat palauttaa useita virheitä. Esimerkiksi Patch-funktion käyttö tietuejoukon päivittämiseen voi palauttaa useita virheitä, yhden jokaiselle epäonnistuvalle tietueelle.

Virheet taulukoissa

Kuten edellä on katsottu, virheitä voidaan tallentaa muuttujiin. Virheitä voi sisältyä myös tietorakenteisiin, kuten taulukoihin. Tämä on tärkeää, jotta yhden tietueen virhe ei voi mitätöidä koko taulukkoa.

Tietotaulukon ohjausobjekti voi olla esimerkiksi seuraava Power Appsissa:

Tietotaulukossa näkyy Reciprocal-kentän syötteen 0 virhe, mikä aiheuttaa Jako nollalla -virheen

Laskenta kohdassa AddColumns on löytänyt nollallajakovirheen yhdelle muuttujista. Tälle tietueelle sarakkeessa Reciprocal on virheellinen arvo (jako nollalla), mutta muissa tietueissa ei, ja ne ovat kunnossa. IsError( Index( output, 2 ) ) Palauttaa arvon false ja IsError( Index( output, 2 ).Value ) palauttaa arvon true (tosi).

Jos taulukon suodattamisen yhteydessä ilmenee virhe, koko tietue on virhe, mutta tulos palautuu, jolloin käyttäjä tietää jonkin käyneen siellä ja että siinä on ongelma.

Käytä tätä esimerkkiä. Tässä alkuperäisessä taulukossa ei ole virheitä, mutta suodatustoimi luo virheen aina, kun arvo on 0:

Tietotaulukossa kahden tietueen virheitä, joita ei voi käsitellä suodatusehdoilla

Arvot -5 ja -3 suodatetaan oikein. Arvot 0 johtavat suodattimen käsittelyssä virheeseen, joten on hyvä tietää, sisällytetäänkö tietue tulokseen vai ei. Jotta käyttäjille olisi mahdollisimman paljon läpinäkyvyyttä ja jotta tekijät voivat tehdä virheenkorjauksen, lisäämme virhetietueen alkuperäisen tietueen sijalle. tässä tapauksessa IsError( Index( output, 2 ) ) palauttaa arvon tosi.

Tietolähteen virheet

Tietolähteitä muokkaavat funktiot, kuten Patch, Collect, Remove, RemoveIf, Update, UpdateIf ja SubmitForm raportoivat virheistä kahdella tavalla:

  • Jokainen näistä toiminnoista palauttaa toiminnon tuloksena virhearvon. Virheitä voidaan havaita funktion IsError avulla ja korvata tai hiljentää funktioiden IfError ja App.OnError avulla tavalliseen tapaan.
  • Toiminnon jälkeen funktio Errors palauttaa myös edellisten toimintojen virheet. Tästä voi olla hyötyä virheen näyttämisessä lomakenäytössä eikä virhettä tarvitse siepata tilamuuttujasta.

Esimerkiksi tämä kaava tarkistaa virheen kohteessa Collect ja näyttää mukautetun virhesanoman:

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

Errors-funktio palauttaa myös tietoja aiemmista virheistä suorituksenaikaisten toimintojen aikana. Siitä voi olla hyötyä, jos lomakenäytössä näkyy virhe eikä virhettä tarvitse siepata tilamuuttujasta.

Virheiden uudelleenluominen

Joskus on odotettavissa joitakin mahdollisia virheitä, jotka voidaan jättää huomiotta. Jos virhe havaitaan kohteissa IfError ja App.OnError, se tulisi välittää seuraavalle korkeamman tason käsittelijälle, ja se voidaan luoda uudelleen funktiolla Error( AllErrors ).

Omien virheiden luominen

Voit myös luoda omia virheitä funktion Error avulla.

Jos luot omia virheitä, on suositeltavaa käyttää yli 1 000-arvoja mahdollisten ristiriitojen välttämiseksi tulevissa järjestelmävirheiden arvoissa.

ErrorKind-luetteloarvot

ErrorKind-luettelointi Arvo Description
AnalysisError 18 Järjestelmävirhe. Kääntäjän analyysissa ilmeni ongelma.
BadLanguageCode 14 Käytössä oli virheellinen tai tunnistamaton kielikoodi.
BadRegex 15 Virheellinen säännöllinen lauseke. Tarkista syntaksi funktion IsMatch, Match tai MatchAll avulla.
Ristiriita 6 Päivitettävää tietuetta on jo muutettu lähteessä, ja ristiriita on ratkaistava. Yleinen ratkaisu on tallentaa paikalliset muutokset, päivittää tietue ja ottaa muutokset uudelleen käyttöön.
ConstraintViolated 8 Tietue ei läpäissyt rajoitustarkistusta palvelimessa.
CreatePermission 3 Käyttäjällä ei ole oikeutta luoda tietuetta tietolähteelle. Esimerkiksi funktiota Collect kutsuttiin.
DeletePermissions 5 Käyttäjällä ei ole oikeutta poistaa tietuetta tietolähteestä. Esimerkiksi funktiota Remove kutsuttiin.
Div0 13 Jako nollalla.
EditPermissions 4 Käyttäjällä ei ole oikeutta luoda tietuetta tietolähteelle. Esimerkiksi funktiota Patch kutsuttiin.
GeneratedValue 9 Arvo välitettiin virheellisesti palvelimeen palvelimen automaattisesti laskemalle kentälle.
InvalidFunctionUsage 16 Virheellinen funktion käyttö. Usein yksi tai useampi funktion argumenteista on virheellinen tai sitä käytetään virheellisesti.
FileNotFound 17 SaveData -tietovarastoa ei löytynyt.
InsufficientMemory 21 Laitteessa ei ole riittävästi muistia tai tallennustilaa toimintoa varten.
InvalidArgument 25 Virheellinen argumentti välitettiin funktiolle.
Sisäinen 26 Järjestelmävirhe. Yhdessä toiminnossa oli sisäinen ongelma.
MissingRequired 2 Tietueen pakollinen kenttä puuttuu.
Verkko 23 Verkkoyhteyksissä ilmeni ongelma.
Ei mikään 0 Järjestelmävirhe. Ei virhettä.
Ei sovellu 27 Arvoa ei ole käytettävissä. Hyödyllistä, jos haluat erottaa tyhjän arvon, jota voidaan käsitellä numeerisissa laskelmissa nollana tyhjistä arvoista, jotka tulisi poistaa mahdollisena ongelmana, jos arvoa käytetään.
NotFound 7 Tietuetta ei löytynyt. Esimerkiksi funktiossa Patch muokattavaa tietuetta.
NotSupported 20 Tämä toisto-ohjelma tai laite ei tue toimintoa.
Numeerinen 24 Numeerista funktiota käytettiin virheellisesti. Esimerkiksi Sqrt arvolla -1.
QuoteExceeded 22 Tallennustilan kiintiö ylittyi.
ReadOnlyValue 10 Sarake on vain luku -tyyppinen, eikä sitä voi muokata.
ReadPermission 19 Käyttäjällä ei ole oikeutta lukea tietuetta tietolähteestä.
Synkronointi 1 Tietolähde ilmoitti virheestä. Lisätietoja on Message-sarakkeessa.
Tuntematon 12 Ilmeni virhe, mutta sen laji on tuntematon.
Vahvistus 11 Tietue ei läpäisynyt vahvistustarkistusta.