Бөлісу құралы:


Қатені өңдеу

Ескертпе

Бұл мақалада сипатталатын әрекет тек Параметрлер>Алдағы мүмкіндіктер>Алдын ала қарау арқылы Формула деңгейіндегі қателерді басқару мүмкіндігі қосулы кезде ғана қолжетімді. Қосымша ақпарат: Қандай мүмкіндіктер қосылғанын басқару

Қателер орын алып тұрады. Желілер тоқтап қалады, жад толады, күтпеген мәндер енеді. Логикаңыз ықтимал мәселелер кездескенде дұрыс жұмыс істеуін жалғастыруы маңызды.

Әдепкі бойынша, қателер бағдарламаның формулалары арқылы өтеді және бағдарламаның соңғы пайдаланушысына хабарланады. Осылайша, соңғы пайдаланушы күтпеген бірдеңе болғанын біледі. Ол басқа енгізу арқылы мәселені шеше алуы мүмкін немесе мәселе туралы бағдарлама иесіне хабарлай алады.

Бағдарлама жасаушы ретінде бағдарламаңыздағы қателерді басқара аласыз:

  • Қателерді анықтау және өңдеу. Қате орын алу мүмкіндігі болса, қате жағдайын анықтау және әрекетті қайталау үшін бағдарлама формулаларын жазуға болады. Соңғы пайдаланушы қате орын алды деп алаңдамауы керек, себебі жасаушы оның мүмкіндігін ескерген. Бұл формула ішіндегі IfError, IsError және IsErrorOrBlank функциялары арқылы істеледі.
  • Қате туралы хабарлау. Қате орын алған формулада өңделмесе, одан кейін қате App.OnError өңдегішіне дейін көтеріледі. Мұнда қатені бұдан былай ауыстыру мүмкін емес, себебі ол орын алып қойған және формула есептеулерінің бөлігі болып табылады. Бірақ қате туралы соңғы пайдаланушыға хабарлану жолын басқару, соның ішінде қате туралы хабарлауға мүлде тыйым салу үшін App.OnError өңдегішін пайдалануға болады. App.OnError сонымен қатар бүкіл қолданба бойынша қате туралы есеп беру үшін жалпы дроссель нүктесін қамтамасыз етеді.
  • Қатені жасау және қайта шығару. Соңында, өз логикаңызда, бағдарламаңызға тән қате жағдайын анықтауыңыз мүмкін. Теңшелетін қателерді жасау үшін Error функциясын пайдаланыңыз. Сондай-ақ Error функциясы IfError немесе App.OnError ішінде тексеруден кейін қатені қайта шығару үшін пайдаланылады.

Жұмысты бастау

Қарапайым мысалдан бастайық.

  1. Power Apps кенеп бағдарламасындағы «Жаңа бағдарлама жасау» экраны.
  2. TextInput басқару элементін кірістіру. Ол әдепкі бойынша TextInput1 атауын пайдаланады.
  3. Label басқару элементін кірістіру.
  4. Label басқару элементінің Text сипатын формулаға орнату
1/Value( TextInput1.Text )

Бізде қате бар, себебі TextInput басқару элементінің әдепкі мәтіні — "Text input" (оны санға түрлендіру мүмкін емес). Әдепкі бойынша, бұл жақсы нәрсе: соңғы пайдаланушы бағдарламада бірдеңе күткендей жұмыс істемей жатқаны туралы хабарландыру алады.

Пайдаланушы осы бағдарламаны іске қосқан сайын қатені көргенін қаламаймыз. "Text input" бәрібір мәтін енгізу жолағы үшін дұрыс әдепкі мән емес болуы мүмкін. Мұны түзету үшін TextInput басқару элементінің Default сипатын мынаған өзгертейік:

Blank()

Қате баннері

Хмм, енді бізде басқа қате бар. blank мәнімен орындалатын бөлу сияқты математикалық амалдар бос мәнді нөлге мәжбүрлеп орнатады. Бұл енді нөлге бөлу қатесін тудырып отыр. Мұны түзету үшін осы бағдарламадағы осы жағдайға тиісті әрекеттің қандай екенін шешуіміз керек. Жауап мәтінді енгізу бос болғанда бос мәнін көрсету болуы мүмкін. Біз мұны формуламызды IfError функциясымен орау арқылы орындай аламыз:

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

Қате баннері көрсетілмеді, бос мәнге байланысты қате бос орынмен ауыстырылды

Енді қате жарамды мәнмен ауыстырылды және қате баннері кетті. Бірақ, біз артық кеткен болуымыз мүмкін, біз пайдаланған IfError функциясы барлық қателерді, соның ішінде "hello" сияқты дұрыс емес мәнді енгізуді қамтиды. Біз мұны IfError функциясын нөлге бөлу жағдайын тек мына арқылы өңдеуге және барлық басқа қателерді қайта шығаратындай реттеу арқылы шеше аламыз:

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

Қате баннері көрсетілмеді, нөлге бөлуге байланысты қате бос орынмен ауыстырылды, әйтпесе қате қайта жіберіледі

Сонымен, бағдарламамызды іске қосып, әртүрлі мәндерді қолданып көрейік.

Ешбір мән жоқ болса, мысалы, бағдарлама іске қосылған кезде, әдепкі мән бос болғандықтан жауап көрсетілмейді, бірақ қате де көрсетілмейді, өйткені IfError функциясы нөлге бөлу қатесін ауыстырады.

Жауап көрсетілмеген және қате баннер жоқ

Егер біз 4 санын терсек, 0,25 деген күтілетін нәтижені аламыз:

0,25 көрсетілді және қате баннер жоқ

Ал егер hello сияқты дұрыс емес бірдеңені терсек, қате баннерін аламыз:

мән көрсетілмейді және

Бұл — қарапайым кіріспе мысал. Бағдарламаның қажеттіліктеріне байланысты қателерді өңдеуді әртүрлі жолдармен орындауға болады:

  1. Қате баннерінің орнына формула арқылы белгі басқару элементінде "#Error" көрсете алатын едік. Ауыстырулардың түрлерін IfError функциясының бірінші аргументімен үйлесімді күйде ұстау үшін Text функциясы арқылы сандық нәтижені мәтін жолына ашық түрде түрлендіруіміз керек.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    қате баннері жоқ және оның орнына нәтиже ретінде #Error көрсетіледі
  2. Осы нақты дананы IfError арқылы ораудың орнына орталықтандырылған App.OnError өңдегішін жазуға болатын еді. Көрсетілген жолды «#Error» мәтініне ауыстыра алмаймыз, себебі қате орын алып қойған және App.OnError тек хабарлауды бақылау үшін қамтамасыз етілген.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Қатені тарату

Қателер формулалар арқылы көбінесе Excel бағдарламасындағыдай өтеді. Мысалы, Excel бағдарламасында A1 ұяшығында =1/0 формуласы болса, онда A1 ұяшығы #DIV0! қате мәнін көрсетеді:

Excel электрондық кестесі A1=1/0 және #DIV/0! ұяшықта көрсетіледі

Егер A2 ұяшығы A1 ұяшығына =A1*2 сияқты формула арқылы сілтеме жасаса, қате сол формула арқылы да таралады:

Excel электрондық кестесі A2=A1*2 және #DIV/0! ұяшықта көрсетіледі

Қате басқаша жағдайда есептелетін мәнді ауыстырады. A2 ұяшығында көбейту нәтижесі жоқ, тек A1 ұяшығындағы бөлу қатесі бар.

Power Fx бірдей жұмыс істейді. Әдетте, қате функцияға немесе операторға аргумент ретінде берілсе, операция орындалмайды және енгізу қатесі операция нәтижесі ретінде өтеді. Мысалы, Mid( Text( 1/0 ), 1, 1 ) нөлге бөлу қатесін қайтарады, себебі ең ішкі қате Text функциясы және Mid функциясы арқылы өтеді:

Жарамсыз операцияны көрсететін қате баннер: нөлге бөлу

Әдетте, қателер Power Apps басқару элементінің сипаттары арқылы өтпейді. Алдыңғы мысалды бірінші белгінің Text сипатының қате күйде екенін көрсететін қосымша басқару элементімен кеңейтейік:

Екінші жапсырма бақылауында қате көрсетілмеген

Қателердің басқару элементі арқылы таратылмауы ештеңе етпейді, себебі жүйе барлық басқару элементі сипаттарында кірістегі қателерді бақылайды. Қате жоғалмайды.

Функциялар мен операторлардың көпшілігі «кіріс қате, шығыс қате» ережесін ұстанады, бірақ кейбір ерекшеліктер бар. IsError, IsErrorOrBlank және IfError функциялары қате жіберілсе де, қатені қайтармайтындай қателермен жұмыс істеуге арналған.

Қателерді бақылау

Мәні пайдаланылғанша бақыланбайды.

Нәтижесінде, If және Select функциялары да қате енгізілсе, қатені қайтармауы мүмкін. If( false, 1/0, 3 ) формуласын қарастырыңыз. Бұл формулада нөлге бөлу қатесі бар, бірақ If функциясы false мәніне байланысты бұл тармақты қабылдамағандықтан, Power Fx және Power Apps қате туралы хабарламайды:

Мәтін сипатында If функциясы бар қате баннер көрсетілмеген

Set функциясын қатемен пайдалану қате айнымалыға орналастырылған нүктеде қате туралы хабарламайды. Мысалы, Power Apps ішінде, мұнда x айнымалысына нөлге бөлу қатесін орналастыратын App.OnStart ішіндегі формула берілген:

App.OnStart қолданбасында орнату функциясын шақыру арқылы қате баннер көрсетілмеді

Ешқандай қате туралы хабарланбады, себебі x айнымалысына сілтеме жасалмаған. Дегенмен, біз белгіні басқару элементін қосып, оның Text сипатын x айнымалысына орнатқан кезде қате көрсетіледі:

X айнымалысына сілтеме жасайтын жапсырма бақылауымен көрсетілген қате баннері

Формула ішіндегі қателерді IfError, IsError және IsErrorOrBlank функциялары арқылы бақылауға болады. Бұл функциялардың көмегімен баламалы мәнді қайтаруға, баламалы әрекетті орындауға немесе қатені бақылауға және хабарлауға дейін өзгертуге болады.

Қателер туралы хабарлау

Қате бақыланғаннан кейін келесі қадам: қате туралы соңғы пайдаланушыға хабарлау.

Excel бағдарламасынан айырмашылығы, қате нәтижесін көрсету үшін әрқашан қолайлы орын бола бермейді, себебі формула нәтижесі бір мәтінді көрсетуге ыңғайлы орын жоқ басқару элементінің X және Y координаттары сияқты сипатқа әкелуі мүмкін. Әрбір Power Fx хосты қателердің соңғы пайдаланушыға қалай көрсетілетінін және жасаушының бұл процесті қаншалықты басқаратынын басқарады. Power Apps ішінде қате баннері көрсетіледі және App.OnError қате туралы хабарлау жолын басқару үшін пайдаланылады.

App.OnError қатені IfError сияқты ауыстыра алмайтынын ескеру маңызды. App.OnError орындалған кезде қате орын алып қойған және нәтиже басқа формулаларға таратылды. App.OnError тек соңғы пайдаланушыға қате туралы хабарлау жолын басқарады және қажет болса, жасаушыға қатені тіркеу үшін ілмек береді.

FirstError және AllErrors деген ауқым айнымалылары қате немесе қателер туралы мәтінмәндік ақпаратты береді. Бұл қатенің түрі, қатенің қай жерде пайда болғаны және қай жерде бақыланғаны туралы ақпарат береді.

Қатеден кейін тоқтату

Әрекет формулалары әрекетті орындауды, дерекқорларды өзгертуді және күйді өзгертуді қолдайды. Бұл формулалар ; тізбектеу операторын (немесе тілге байланысты ;; тізбектеу операторын) пайдаланып, ретімен бірнеше әрекетті орындауға мүмкіндік береді.

Мысалы, бұл жағдайда тор басқару элементі T кестесінде не бар екенін көрсетіп тұр. Әрбір түймешікті таңдау осы кестедегі күйді екі Patch функциясын шақыру арқылы өзгертеді:

Әр түймені басқаннан кейін кездейсоқ сандармен жаңартылып жатқан T кестесіндегі екі жазбаны көрсететін анимация

Тізбектелген әрекет формуласында әрекеттер бірінші қатеден кейін тоқтамайды. Мысалымызды бірінші Patch функциясын шақыруда жарамсыз индекс нөмірін беретіндей өзгертейік. Екінші Patch функциясы осы бұрынғы қатеге қарамастан жалғасады. Бірінші қате туралы соңғы пайдаланушыға хабарланады және Studio ішінде басқару элементінде қате ретінде көрсетіледі:

Әр түймені басқаннан кейін кездейсоқ сандармен жаңартылып жатқан T кестесіндегі екінші жазбаны ғана көрсететін анимация, қатеге әкелетін бірінші жазба

IfError қатеден кейін орындауды тоқтату үшін пайдалануға болады. If функциясына ұқсас, бұл функцияның үшінші аргументі қате болмаса ғана орындалатын әрекеттерді орналастыру орнын қамтамасыз етеді:

T кестесіндегі жазбалардың ешқайсысына да өзгерістер көрсетілмейтін анимация, себебі IfError қатеден кейін екінші операцияның аяқталуына кедергі жасайды

ForAll итерацияларының бірі кезінде қате орын алса, қалған итерациялар тоқтатылмайды. ForAll параллель орындауға мүмкіндік беретін әрбір итерацияны дербес орындауға арналған. ForAll аяқталғанда, барлық кездескен қателерді қамтитын қате қайтарылады (IfError немесе App.OnError ішіндегі AllErrors тексеру арқылы).

Мысалы, келесі формула ForAll ішінде екі қатені қайтаруға әкеледі (0-ге тең Value үшін нөлге бөлу үшін, екі рет) және Collection дегеннің үш жазбасы болады (Value 0 болмаған кезде): [1, 2, 3].

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

Бірнеше қатемен жұмыс істеу

Әрекет формуласы бірнеше әрекетті орындай алатындықтан, ол сонымен бірге бірнеше қатеге тап болуы мүмкін.

Әдепкі бойынша, бірінші қате туралы соңғы пайдаланушыға хабарланады. Бұл мысалда, Patch функциясын шақырулардың екеуі де сәтсіз аяқталады, екіншісі нөлге бөлу қатесімен аяқталады. Пайдаланушыға тек бірінші қате (индекс туралы) көрсетіледі:

Бірінші индекс қатесі қате баннерінде көрсетіледі, екінші қате туралы хабарланбайды

IfError функциясы және App.OnError оқиғасы AllErrors ауқым айнымалысымен кездескен барлық қателерге қатынаса алады. Бұл жағдайда біз мұна глобалдық айнымалыға орнатып, кездескен екі қатені де қарай аламыз. Олар кестеде кездескен ретімен көрінеді:

Қателерді PatchErrors жаһандық айнымалысына түсіру, мұнда біз екі қатенің де бар екенін көреміз

Бірнеше қате әрекеттік емес формулаларда да қайтарылуы мүмкін. Мысалы, жаңарту үшін жазбалар бумасында Patch функциясын пайдалану сәтсіз әрбір жазба үшін бір-бірден бірнеше қатені қайтаруы мүмкін.

Кестелердегі қателер

Бұрын көргеніміздей, қателерді айнымалыларда сақтауға болады. Қателерді кестелер сияқты деректер құрылымдарына қосуға да болады. Бұл кез келген бір жазбадағы қате бүкіл кестені жарамсыз ете алмауы үшін маңызды.

Мысалы, Power Apps ішінде осы деректер кестесі басқару элементін қарастырыңыз:

Өріс үшін қатені көрсететін деректер кестесі Нөлге бөлу қатесіне әкелетін 0 енгізу үшін өзара

AddColumns ішіндегі есептеу мәндердің бірі үшін нөлге бөлу қатесіне тап болды. Сол бір жазба үшін Reciprocal бағанында қате мән (нөлге бөлу) бар, бірақ басқа жазбаларда қате мән жоқ және дұрыс. IsError( Index( output, 2 ) ) жалған мәнін және IsError( Index( output, 2 ).Value ) шын мәнін қайтарады.

Кестені сүзу кезінде қате орын алса, бүкіл жазба қате болып табылады, бірақ соңғы пайдаланушы онда бірдеңе болғанын және мәселе бар екенін білуі үшін нәтижеде қайтарылады.

Мына мысалды қараңыз. Мұнда бастапқы кестеде қателер жоқ, бірақ сүзу әрекеті Value 0-ге тең болғанда қате тудырады:

Сүзгі шартымен өңделмеген екі жазбаның қателерін көрсететін деректер кестесі

-5 және -3 мәндері дұрыс сүзгіден өткен. 0 мәндері сүзгіні өңдеуде қатеге әкеледі, сондықтан жазба нәтижеге қосу-қоспау керектігі анық емес. Соңғы пайдаланушылар үшін транспаренттікті арттыру және жасаушыларға күйін келтіруге көмектесу үшін түпнұсқаның орнына қате жазбасын қосамыз. Бұл жағдайда IsError( Index( output, 2 ) ) true мәнін қайтарады.

Деректер көзінің қателері

Patch, Collect, Remove, RemoveIf, Update, UpdateIf және SubmitForm сияқты деректер көздеріндегі деректерді өзгертетін функциялар қателер туралы екі жолмен хабарлайды:

  • Осы функциялардың әрқайсысы операцияның нәтижесі ретінде қате мәнін қайтарады. Қателерді IsError функциясымен анықтауға немесе әдеттегідей IfError және App.OnError функцияларымен басуға болады.
  • Операциядан кейін Errors функциясы алдыңғы әрекеттердің қателерін де қайтарады. Ол күй айнымалысында қатені жазудың қажеті жоқ пішін экранында қате туралы хабарды көрсету үшін пайдалы болуы мүмкін.

Мысалы, бұл формула Collect дегендегі қатені тексереді және теңшелген қате туралы хабарды көрсетеді:

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

Сондай-ақ Errors функциясы орындалу уақытындағы операциялар кезінде бұрынғы қателер туралы ақпаратты қайтарады. Ол күй айнымалысында қатені жазудың қажеті жоқ пішін экранында қатені көрсету үшін пайдалы болуы мүмкін.

Қателерді қайта шығару

Кейде кейбір ықтимал қателер күтіледі және оларды қауіпсіз түрде елемеуге болады. IfError және App.OnError ішінде, келесі жоғарырақ өңдеушіге жіберілетін қате анықталса, оны Error( AllErrors ) арқылы қайта шығаруға болады.

Жеке қателерді жасау

Сондай-ақ Error функциясы арқылы жеке қателеріңізді жасай аласыз.

Егер жеке қателеріңізді жасап жатсаңыз, болашақ жүйелік қате мәндерімен ықтимал қайшылықтарды болдырмау үшін 1000-нан жоғарырақ мәндерді пайдалану ұсынылады.

ErrorKind санамалау мәндері

ErrorKind санамалауы Value Сипаттама
AnalysisError 18 Жүйелік қате. Компилятор талдауында мәселе туындады.
BadLanguageCode 14 Жарамсыз немесе танылмаған тіл коды пайдаланылды.
BadRegex 15 Жарамсыз тұрақты өрнек. IsMatch, Match немесе MatchAll функцияларында пайдаланылған синтаксисті тексеріңіз.
Қайшылық 6 Жаңартылып жатқан жазба көзде өзгертіліп қойылған және қайшылықты шешу қажет. Әдеттегі шешім: кез келген жергілікті өзгерістерді сақтау, жазбаны жаңарту және өзгерітерді қайта қолдану.
ConstraintViolated 8 Жазба серверде шектеуді тексеруден өтпеді.
CreatePermission 3-көше Пайдаланушыда осы деректер көзі үшін жазба жасау рұқсаты жоқ. Мысалы, Collect функциясы шақырылды.
DeletePermissions 5 Пайдаланушыда осы деректер көзі үшін жазбаны жою рұқсаты жоқ. Мысалы, Remove функциясы шақырылды.
Div0 13 Нөлге бөлу.
EditPermissions 4 Пайдаланушыда осы деректер көзі үшін жазба жасау рұқсаты жоқ. Мысалы, Patch функциясы шақырылды.
GeneratedValue 9 Сервер автоматты түрде есептейтін өріс үшін мән серверге қателесіп жіберілді.
InvalidFunctionUsage 16 Функцияны жарамсыз пайдалану. Көбінесе функцияның бір немесе бірнеше аргументі дұрыс емес болады немесе жарамсыз жолмен пайдаланылады.
FileNotFound 17 SaveData қоймасын табу мүмкін болмады.
InsufficientMemory 21 Құрылғыда операция үшін жад немесе қойма жеткіліксіз.
InvalidArgument 25 Функцияға жарамсыз аргумент берілді.
Ішкі 26 Жүйелік қате. Функциялардың біріне қатысты ішкі мәселе болды.
MissingRequired 2-көше Жазбаның міндетті өрісі болмады.
Желі 23 Желілік қосылымдарда мәселе болды.
Ешқандай 0 Жүйелік қате. Қате жоқ.
NotApplicable 27 Қолжетімді мән жоқ. Сандық есептеулерде нөл ретінде қарастыруға болатын blank мәнін мән пайдаланылған жағдайда ықтимал мәселе ретінде жалаушалануы тиіс бос мәндерден ажырату үшін пайдалы.
NotFound 7 Жазбаны табу мүмкін болмады. Мысалы, Patch функциясында өзгертілетін жазба.
NotSupported 20 Бұл ойнатқыш немесе құрылғы қолдамайтын операция.
Сандық 24 Сандық функция дұрыс емес түрде пайдаланылды. Мысалы, Sqrt функциясында -1 саны пайдаланылды.
QuoteExceeded 22 Қойма квотасы асырылды.
ReadOnlyValue 10 Баған тек оқуға арналған және оны өзгерту мүмкін емес.
ReadPermission 19 Пайдаланушыда осы деректер көзі үшін жазбаны оқу рұқсаты жоқ.
Синхрондау 1-көше Деректер көзі қате туралы хабарлады. Қосымша ақпарат алу үшін «Хабар» бағанын қараңыз.
Белгісіз 12 Қате болды, бірақ түрі белгісіз.
Тексеру 11 Жазба тексерім тексеруінен өтпеді.