Делите путем


Руковање грешкама

Белешка

Понашање које овај чланак описује доступно је само када је укључена пробна функција Управљање грешкама на нивоу формуле у менију Поставке>Предстојеће функције>Преглед. Још информација: Контролисање које функције су омогућене

Грешке се дешавају. Мреже падају, складиште се попуњава, улазе неочекиване вредности. Важно је да ваша логика настави да ради како треба суочена са потенцијалним проблемима.

Грешке подразумевано пролазе кроз формуле апликације и пријављују се крајњем кориснику апликације. На тај начин крајњи корисник зна да се нешто неочекивано догодило, он потенцијално може сам да реши проблем другим уносом или може да пријави проблем власнику апликације.

Као аутор апликације, можете да преузмете контролу над грешкама у апликацији:

  • Откривање грешке и руковање њоме. Ако постоји шанса да дође до грешке, формуле апликације могу бити написане тако да открију стање грешке и поново покушају операцију. Крајњи корисник не мора да буде забринут да је дошло до грешке јер је аутор узео у обзир ту могућност. Ово се ради са функцијама IfError, IsError и IsErrorOrBlank у оквиру формуле.
  • Пријављивање грешке. Ако се грешком не рукује у формули тамо где се на њу наишло, грешка се затим избија у руковаоцу App.OnError. Овде се грешка више не може заменити јер се већ појавила и део је израчунавања формула. Међутим, апликацију App.OnError можете да користите да бисте контролисали како се грешка пријављује крајњем кориснику, укључујући и свеукупно сузбијање извештавања о грешкама. Апп .ОнЕррор такође пружа заједничку тачку гушења за извештавање о грешкама у целој апликацији.
  • Креирање и поновно препознавање грешке. На крају, можете да откријете стање грешке сопственом логиком, стање које је специфично за вашу апликацију. Користите функцију Error да бисте креирали и пријавили прилагођене грешке. Функција Error се такође користи за поновно препознавање грешке након испитивања у IfError или App.OnError.

Први кораци

Почнимо са једноставним примером.

  1. Креирајте нови екран у Power Apps апликацији са подлогом.
  2. Унесите контролу TextInput. Подразумевано ће то бити име TextInput1.
  3. Уметните контролу Label.
  4. Подесите својство Text контроле Label на формулу
1/Value( TextInput1.Text )

Банер грешке приказан са

Имамо грешку зато што је подразумевани текст контроле TextInput "Text input" који се не може конвертовати у број. Ово је подразумевано добра ствар: крајњи корисник ће добити обавештење да нешто не функционише на очекивани начин у апликацији.

Очигледно, не желимо да поздравимо корисника грешком сваки пут када покрене ову апликацију. Вероватно "Text input" ионако није подразумевана вредност за оквир за унос текста. Да бисмо то решили, променимо својство Default контроле TextInput у:

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" )
    
    нема банер грешке и уместо тога #Еррор је приказан као резултат
  2. Уместо да умотамо ову конкретну инстанцу функцијом 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 * 2 и #ДИВ / 0! приказан у ћелији

Грешка замењује вредност која би иначе била израчуната. Нема резултата множења у ћелији A2, већ само грешке из дељења у A1.

Power Fx функционише на исти начин. Уопште, ако је грешка наведена као аргумент функције или оператора, операција се неће извршити и улазна грешка ће проћи као резултат операције. На пример, Mid( Text( 1/0 ), 1, 1 ) враћа грешку „Дељење нулом“, јер крајња унутрашња грешка пролази кроз функцију Text и функцију Mid:

Банер грешке који приказује неважећу операцију: подела са нулом

Уопште, грешке не пролазе кроз својства Power Apps контрола. Проширимо претходни пример додатном контролом која приказује да ли је својство прве ознаке Text стање грешке:

Нема грешке приказане на другој контроли налепнице

У реду је што се грешке не преносе кроз контролу, јер ће систем приметити грешке на уносу у сва својства контроле. Грешка неће бити изгубљена.

Већина функција и оператора следи правило „грешка улази, грешка излази“, али постоје неки изузеци. Функције IsError, IsErrorOrBlank и IfError су осмишљене за рад са грешкама, тако да можда неће вратити грешку чак и ако се она проследи у њих.

Уочавање грешака

Грешке се не примећују док се њихова вредност не искористи.

Као резултат тога, функције If i Select такође не могу да врате грешку ако се проследи. Размотрите формулу If( false, 1/0, 3 ). У овој формули је присутна подела нулом, али пошто If не узима ту грану јер је false, Power Fx и Power Apps неће пријавити грешку:

Нема банера грешке приказаног са функцијом Ако у особини ознаке Текст

Коришћење функције Set са грешком неће пријавити грешку у тренутку када се грешка смести у променљиву. На пример, у услузи Power Apps, ево формуле у руковаоцу App.OnStart која поставља грешку дељења нулом у променљиву x:

Нема банера грешке приказаног са позивом Сет функције у Апп.ОнСтарт

Грешка се не пријављује јер x не упућује на то. Међутим, оног тренутка када додамо контролу ознаке и поставимо њено својство Text на x, грешка се приказује:

Банер грешке приказан са контролом ознаке која упућује на променљиву к

Грешке можете уочити формулама које користе функције IfError, IsError и IsErrorOrBlank. Помоћу ових функција можете да вратите алтернативну вредност, предузмете алтернативну радњу или измените грешку пре него што се она уочи и пријави.

Извештавање о грешкама

Када се грешка уочи, следећи корак је да пријавите грешку крајњем кориснику.

За разлику од програма Excel, не постоји увек згодно место за приказивање резултата грешке, јер резултат формуле може да утиче на својство као што су координате X и Y контроле за коју не постоји погодно место за приказивање текста. Сваки Power Fx хост контролише како се грешке на крају приказују крајњем кориснику и колико контроле аутор има над овим процесом. У Power Apps програму се приказује банер грешке и руковалац App.OnError се користи за контролисање начина на који се грешка пријављује.

Важно је напоменути да App.OnError не може да замени грешку на исти начин као што може IfError. У тренутку када се извршава App.OnError, грешка се већ догодила, а резултат се пренео кроз друге формуле. Апп .ОнЕррор само контролише како се грешка пријављује крајњем кориснику и обезбеђује куку за произвођача да пријави грешку ако жели.

Променљиве опсега FirstError и AllErrors пружају контекстуалне информације о грешци или грешкама. То пружа информације о врсти грешке и о томе одакле је грешка потиче и где је примећена.

Заустављање након грешке

Формуле за понашање подржавају предузимање радњи, мењање база података и промену статуса. Ове формуле омогућавају обављање више радњи у низу помоћу оператора за уланчавање ; (или ;;, у зависности од локалног стандарда).

У овом случају, на пример, контрола мреже приказује шта се налази у табели T. Сваки избор дугмета мења стање у овој табели са два позива функције patch:

Анимација која приказује два записа у табели Т која се ажурира случајним бројевима након сваког клика на дугме

У ланчаној формули понашања, радње се не заустављају после прве грешке. Изменимо наш пример да проследимо неважећи број индекса у првом позиву функције Patch. Друга функција Patch се наставља упркос овој ранијој грешци. Прва грешка се пријављује крајњем кориснику и приказује се као грешка у програму Studio на контроли:

Анимација која приказује само други запис у табели Т који се ажурира случајним бројевима након сваког клика на дугме, први запис резултира грешком

ИфЕррор се може користити за заустављање извршења након грешке. Слично функцији If, трећи аргумент ове функције обезбеђује место за извршавање радњи које би требало извршити само ако нема грешке:

Анимација која не приказује промене ни у једном запису у табели Т, јер ИфЕррор спречава другу операцију да се заврши након грешке

Ако се наиђе на грешку током једне од итерација петље ForAll, остале итерације се неће зауставити. ФорАлл је дизајниран да изврши сваку итерацију независно, омогућавајући паралелно извршење. Када се ForAll доврши, биће враћена грешка која садржи све грешке на које је петља наишла (испитивањем AllErrors у IfError или App.OnError).

На пример, следећа формула ће резултирати тиме да ForAll врати две грешке (за дељење нулом за Value 0, двапут), а 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 апликацијама:

Табела података која приказује грешку за поље Реципрочни за улаз од 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 Системска грешка. Нема грешке.
Није примењиво 27 Нема доступних вредности. Корисно за разликовање празне вредности која се може третирати као нула у нумеричким израчунавањима од празних вредности које би требало означити као потенцијални проблем ако се вредност користи.
NotFound 7 Није могуће пронаћи запис. На пример, запис који треба изменити у функцији Patch.
NotSupported 20 Овај плејер или уређај не подржава операцију.
Нумерички 24 Нумеричка функција је коришћена на неприкладан начин. На пример, замените Sqrt са -1.
QuoteExceeded 22 Премашена је квота за складиштење.
ReadOnlyValue 1.0. Колона је само за читање и не може се мењати.
ReadPermission 19 Корисник нема дозволу за читање записа у овом извору података.
Синхронизуј 1. Грешка је пријављена од стране извора података. Проверите колону Порука за више информација.
Непознато 12 Дошло је до грешке, али непознате врсте.
Провера ваљаности 11. Запис није прошао проверу ваљаности.