Қатені өңдеу
Ескертпе
Бұл мақалада сипатталатын әрекет тек Параметрлер>Алдағы мүмкіндіктер>Алдын ала қарау арқылы Формула деңгейіндегі қателерді басқару мүмкіндігі қосулы кезде ғана қолжетімді. Қосымша ақпарат: Қандай мүмкіндіктер қосылғанын басқару
Қателер орын алып тұрады. Желілер тоқтап қалады, жад толады, күтпеген мәндер енеді. Логикаңыз ықтимал мәселелер кездескенде дұрыс жұмыс істеуін жалғастыруы маңызды.
Әдепкі бойынша, қателер бағдарламаның формулалары арқылы өтеді және бағдарламаның соңғы пайдаланушысына хабарланады. Осылайша, соңғы пайдаланушы күтпеген бірдеңе болғанын біледі. Ол басқа енгізу арқылы мәселені шеше алуы мүмкін немесе мәселе туралы бағдарлама иесіне хабарлай алады.
Бағдарлама жасаушы ретінде бағдарламаңыздағы қателерді басқара аласыз:
- Қателерді анықтау және өңдеу. Қате орын алу мүмкіндігі болса, қате жағдайын анықтау және әрекетті қайталау үшін бағдарлама формулаларын жазуға болады. Соңғы пайдаланушы қате орын алды деп алаңдамауы керек, себебі жасаушы оның мүмкіндігін ескерген. Бұл формула ішіндегі IfError, IsError және IsErrorOrBlank функциялары арқылы істеледі.
- Қате туралы хабарлау. Қате орын алған формулада өңделмесе, одан кейін қате App.OnError өңдегішіне дейін көтеріледі. Мұнда қатені бұдан былай ауыстыру мүмкін емес, себебі ол орын алып қойған және формула есептеулерінің бөлігі болып табылады. Бірақ қате туралы соңғы пайдаланушыға хабарлану жолын басқару, соның ішінде қате туралы хабарлауға мүлде тыйым салу үшін App.OnError өңдегішін пайдалануға болады. App.OnError сонымен қатар бүкіл қолданба бойынша қате туралы есеп беру үшін жалпы дроссель нүктесін қамтамасыз етеді.
- Қатені жасау және қайта шығару. Соңында, өз логикаңызда, бағдарламаңызға тән қате жағдайын анықтауыңыз мүмкін. Теңшелетін қателерді жасау үшін Error функциясын пайдаланыңыз. Сондай-ақ Error функциясы IfError немесе App.OnError ішінде тексеруден кейін қатені қайта шығару үшін пайдаланылады.
Жұмысты бастау
Қарапайым мысалдан бастайық.
- Power Apps кенеп бағдарламасындағы «Жаңа бағдарлама жасау» экраны.
- TextInput басқару элементін кірістіру. Ол әдепкі бойынша TextInput1 атауын пайдаланады.
- Label басқару элементін кірістіру.
- 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 деген күтілетін нәтижені аламыз:
Ал егер hello
сияқты дұрыс емес бірдеңені терсек, қате баннерін аламыз:
Бұл — қарапайым кіріспе мысал. Бағдарламаның қажеттіліктеріне байланысты қателерді өңдеуді әртүрлі жолдармен орындауға болады:
- Қате баннерінің орнына формула арқылы белгі басқару элементінде "#Error" көрсете алатын едік. Ауыстырулардың түрлерін IfError функциясының бірінші аргументімен үйлесімді күйде ұстау үшін Text функциясы арқылы сандық нәтижені мәтін жолына ашық түрде түрлендіруіміз керек.
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- Осы нақты дананы IfError арқылы ораудың орнына орталықтандырылған App.OnError өңдегішін жазуға болатын еді. Көрсетілген жолды «#Error» мәтініне ауыстыра алмаймыз, себебі қате орын алып қойған және App.OnError тек хабарлауды бақылау үшін қамтамасыз етілген.
If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
Қатені тарату
Қателер формулалар арқылы көбінесе Excel бағдарламасындағыдай өтеді. Мысалы, Excel бағдарламасында A1
ұяшығында =1/0
формуласы болса, онда A1 ұяшығы #DIV0!
қате мәнін көрсетеді:
Егер A2
ұяшығы A1
ұяшығына =A1*2
сияқты формула арқылы сілтеме жасаса, қате сол формула арқылы да таралады:
Қате басқаша жағдайда есептелетін мәнді ауыстырады. 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 қате туралы хабарламайды:
Set функциясын қатемен пайдалану қате айнымалыға орналастырылған нүктеде қате туралы хабарламайды. Мысалы, Power Apps ішінде, мұнда x
айнымалысына нөлге бөлу қатесін орналастыратын App.OnStart ішіндегі формула берілген:
Ешқандай қате туралы хабарланбады, себебі x
айнымалысына сілтеме жасалмаған. Дегенмен, біз белгіні басқару элементін қосып, оның Text сипатын x
айнымалысына орнатқан кезде қате көрсетіледі:
Формула ішіндегі қателерді IfError, IsError және IsErrorOrBlank функциялары арқылы бақылауға болады. Бұл функциялардың көмегімен баламалы мәнді қайтаруға, баламалы әрекетті орындауға немесе қатені бақылауға және хабарлауға дейін өзгертуге болады.
Қателер туралы хабарлау
Қате бақыланғаннан кейін келесі қадам: қате туралы соңғы пайдаланушыға хабарлау.
Excel бағдарламасынан айырмашылығы, қате нәтижесін көрсету үшін әрқашан қолайлы орын бола бермейді, себебі формула нәтижесі бір мәтінді көрсетуге ыңғайлы орын жоқ басқару элементінің X және Y координаттары сияқты сипатқа әкелуі мүмкін. Әрбір Power Fx хосты қателердің соңғы пайдаланушыға қалай көрсетілетінін және жасаушының бұл процесті қаншалықты басқаратынын басқарады. Power Apps ішінде қате баннері көрсетіледі және App.OnError қате туралы хабарлау жолын басқару үшін пайдаланылады.
App.OnError қатені IfError сияқты ауыстыра алмайтынын ескеру маңызды. App.OnError орындалған кезде қате орын алып қойған және нәтиже басқа формулаларға таратылды. App.OnError тек соңғы пайдаланушыға қате туралы хабарлау жолын басқарады және қажет болса, жасаушыға қатені тіркеу үшін ілмек береді.
FirstError және AllErrors деген ауқым айнымалылары қате немесе қателер туралы мәтінмәндік ақпаратты береді. Бұл қатенің түрі, қатенің қай жерде пайда болғаны және қай жерде бақыланғаны туралы ақпарат береді.
Қатеден кейін тоқтату
Әрекет формулалары әрекетті орындауды, дерекқорларды өзгертуді және күйді өзгертуді қолдайды. Бұл формулалар ;
тізбектеу операторын (немесе тілге байланысты ;;
тізбектеу операторын) пайдаланып, ретімен бірнеше әрекетті орындауға мүмкіндік береді.
Мысалы, бұл жағдайда тор басқару элементі T
кестесінде не бар екенін көрсетіп тұр. Әрбір түймешікті таңдау осы кестедегі күйді екі Patch функциясын шақыру арқылы өзгертеді:
Тізбектелген әрекет формуласында әрекеттер бірінші қатеден кейін тоқтамайды. Мысалымызды бірінші Patch функциясын шақыруда жарамсыз индекс нөмірін беретіндей өзгертейік. Екінші Patch функциясы осы бұрынғы қатеге қарамастан жалғасады. Бірінші қате туралы соңғы пайдаланушыға хабарланады және Studio ішінде басқару элементінде қате ретінде көрсетіледі:
IfError қатеден кейін орындауды тоқтату үшін пайдалануға болады. If функциясына ұқсас, бұл функцияның үшінші аргументі қате болмаса ғана орындалатын әрекеттерді орналастыру орнын қамтамасыз етеді:
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 ауқым айнымалысымен кездескен барлық қателерге қатынаса алады. Бұл жағдайда біз мұна глобалдық айнымалыға орнатып, кездескен екі қатені де қарай аламыз. Олар кестеде кездескен ретімен көрінеді:
Бірнеше қате әрекеттік емес формулаларда да қайтарылуы мүмкін. Мысалы, жаңарту үшін жазбалар бумасында Patch функциясын пайдалану сәтсіз әрбір жазба үшін бір-бірден бірнеше қатені қайтаруы мүмкін.
Кестелердегі қателер
Бұрын көргеніміздей, қателерді айнымалыларда сақтауға болады. Қателерді кестелер сияқты деректер құрылымдарына қосуға да болады. Бұл кез келген бір жазбадағы қате бүкіл кестені жарамсыз ете алмауы үшін маңызды.
Мысалы, Power Apps ішінде осы деректер кестесі басқару элементін қарастырыңыз:
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 | Жазба тексерім тексеруінен өтпеді. |