Функции за грешка, IfError, IsError, IsBlankOrError
Отнася се за: Платно приложения Dataverse формула колони Desktop потоци Модел задвижване приложения Power Platform CLI
Открива грешки и предоставя алтернативна стойност или предприема действия. Създаване на потребителска грешка или преминаване през грешка.
Бележка
- Поведението, описано в тази статия, е налично само когато функцията за преглед на управлението на грешки на ниво формула в Настройки > Предстоящи функции > Преглед е включена.
IfError
Функцията IfError тества стойности, докато не намери грешка. Ако функцията открие грешка, функцията оценява и връща съответната заместваща стойност и спира по-нататъшната оценка. Може да бъде предоставена и стойност по подразбиране, когато няма намерени грешки. Структурата на IfError прилича на тази на функцията If: IfError тества за грешки, докато If тества за вярно.
Използвайте IfError, за да замените грешка с валидна стойност, така че изчисленията надолу по веригата да продължат. Например, използвайте тази функция, ако въвеждането на потребителя може да доведе до деление на нула:
IfError( 1/x, 0 )
Тази формула се връща 0
, ако стойността на x
е нула, като 1/x
ще създаде грешка. Ако x
не е нула, тогава 1/x
се връща.
Спиране на по-нататъшната обработка
Кога свързвате верижно формули заедно във формули за поведение, като:
Patch( DS1, ... );
Patch( DS2, ... )
Втората функция Patch към DS2
ще се направи опит, дори ако Patch към DS1
е неуспешна. Обхватът на грешката е ограничен до всяка верига, формулирана.
Използвайте IfError, за да извършите действие и да продължите обработката само ако действието е било успешно. Приложете IfError към този пример:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ),
Patch( DS2, ... ), Notify( "problem in the second action" )
)
Ако Корекция на DS1
има проблем, се изпълнява първото Уведоми. Не се извършва по-нататъшна обработка, включително втората Корекция на DS2
. Ако първата Корекция успява, втората Корекция ще се изпълни.
Ако е доставен, опционалният аргумент DefaultResult се връща, ако не бъдат открити грешки. Без този аргумент последният аргумент стойност се връща.
Въз основа на последния пример, връщащата стойност от IfError може да се провери дали има някакви проблеми:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ); false,
Patch( DS2, ... ), Notify( "problem in the second action" ); false,
true
)
Тип на съвместимост
IfError ще върне стойността на един от своите аргументи. Видовете всички стойности, които могат да бъдат върнати от IfError трябва да са съвместими.
В последния пример, Корекция ще върне запис, който не е съвместим с булевите, използвани за Замяна формули или DefaultResult. Което е добре, тъй като няма ситуация, в която връщащата се стойност от тях извикванията на Корекция ще бъдат върнати от IfError.
Бележка
Докато поведението в процес на промяна, видовете на всички аргументи за IfError трябва да са съвместими в момента.
В простия пример, описан по-рано:
IfError( 1/x, 0 )
Типовете 1/x
и 0
са съвместими, защото и двата са числа. Ако не са, вторият аргумент ще бъде принуден да съответства на типа на първия аргумент.
Excel ще покаже #DIV/0! когато възникне деление на нула.
Обмислете IfError със следното вместо това:
IfError( 1/x, "#DIV/0!" )
Горната формула няма да работи. Текстовият низ "#DIV/0!"
ще бъде принуден към типа на първия аргумент за IfError, което е число. Резултатът от IfError ще бъде още една грешка, тъй като текстовият низ не може да бъде принуден. Като поправете, преобразувайте първия аргумент в текстов низ, така че IfError винаги връща текстов низ:
IfError( Text( 1/x ), "#DIV/0!" )
Както се вижда по-горе, IfError може да върне грешка, ако Замяна или DefaultResult е грешка.
FirstError / AllErrors
Във формулите за заместване информацията за намерените грешки е достъпна чрез записа FirstError и таблицата AllErrors. AllErrors е таблица със записи с информация за грешки, като FirstError е пряк път към първия запис на тази таблица. FirstError винаги ще връща същата стойност като First( AllErrors ).
Записите за грешки включват:
Поле | Тип | Описание |
---|---|---|
Вид | ErrorKind номериране (число) | Категория на грешката. |
Съобщение | Текстов низ | Съобщение за грешката, подходящо за показване на крайния потребител. |
Източник | Текстов низ | Местоположение, където е възникнала грешката, използвано за докладване. Например, за формула, обвързана със свойство на контрола, това ще бъде във формуляра ControlName.PropertyName. |
Наблюдавани | Текстов низ | Местоположение, в което грешката е показана на потребителя, използвано за докладване. Например, за формула, обвързана със свойство на контрола, това ще бъде във формуляра ControlName.PropertyName. |
Подробности | Запис | Подробности за грешката. Понастоящем се предоставят подробности само за мрежови грешки. Този запис включва HttpStatusCode whcih съдържа HTTP кода на състоянието и HttpResponse който съдържа тялото на отговора от конектора или услуга. |
Например, обмислете следната формула като свойство OnSelect на контролата бутон:
Set( a, 1/0 )
И тази формула на OnSelect свойство за втората контрола на Бутон:
IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )
Примерната формула по-горе ще показва следния банер, когато двата бутона са активирани последователно:
Обикновено ще има само една грешка, с която FirstError може да работи достатъчно добре. Има обаче сценарии, при които могат да бъдат върнати множество грешки. Например, когато използвате оператор за верига на формула или паралелна функция. Дори в тези ситуации докладването на FirstError може да е достатъчно, за да разкрие проблем, вместо да претовари потребителя с множество грешки. Ако все още имате изискване да работите с всяка грешка поотделно, можете да използвате таблицата AllErrors.
IsError
Функцията IsError тества за стойност на грешка.
Върнатата стойност е булево вярно или невярно.
Използването на IsError ще предотврати по-нататъшната обработка на грешката.
IsBlankOrError
функционалните тестове на IsBlankOrError за празна стойност или стойност за грешка и е еквивалент на Or( IsBlank( X ), IsError( X ) )
.
Когато активирате обработка на грешки за съществуващи приложения, заменете IsBlank с IsBlankOrError, за да запазите съществуващото поведение на приложението. Преди добавянето на обработка на грешки, празна стойност беше използвана за представяне както на нулеви стойности от бази данни, така и на стойности на грешки. Обработката на грешки разделя тези две интерпретации на празно което може да промени поведението на съществуващите приложения, които продължават да използват IsBlank.
Върнатата стойност е булево вярно или невярно.
Използвайки IsBlankOrError ще предотврати по-нататъшна обработка на грешката.
Използвайте функцията Error за създаване и докладване на персонализирана грешка. Например, може да имате логика, за да определите дали дадена стойност е валидна за вашия контекст или не - нещо, което не се проверява автоматично за проблем. Можете да създадете и върнете своя собствена грешка, заедно с Kind и Message, като използвате същия запис, описан по-горе за функцията IfError.
В контекста на IfError, използвайте функцията Error за повторно хвърляне или преминаване през грешка. Например, вашата логика в IfError може да реши, че в някои случаи грешката може безопасно да бъде игнорирана, но в други случаи грешката е важно да бъде изпратена. В рамките на IfError или App.OnError използвайте Error( FirstError ) за преминаване през грешка.
На функцията Error може също да бъде предадена таблица с грешки, както ще се намери в таблицата AllErrors. Използвайте Error( AllErrors ) за повторно извеждане на всички грешки, а не само на първата.
Празен запис или празна таблица, предадена на Error не води до грешка.
Синтаксис
Грешка( ErrorRecord )
Грешка( Таблица с грешки )
- ErrorRecord – Задължително. Запис с информация за грешка, включително Kind, Message и други полета. Kind е задължително. FirstError може да се предава директно.
- ErrorTable – Задължително. Таблица със записи с информация за грешки. AllErrors може да се предава директно.
IfError( Value1, Replacement1 [, Value2, Replacement2, ... [, DefaultResult ] ] )
- Value(s) – Задължително. Формули за тестване на стойност за грешка.
- Replacement(s) – Задължително. Формулите за оценка и стойности, които да се върнат, ако съвпадат с аргументите стойност върнаха грешка.
- DefaultResult – Опционално. Формулите за оценка на това дали формулата не намира грешки.
IsError( Value )
IsBlankOrError( Стойност )
- Value – Задължително. Формула за тестване.
Примери
Прост IfError
Формула | Описание | Резултат |
---|---|---|
IfError( 1, 2 ) | Първият аргумент не е грешка. Функцията няма други грешки за проверка и няма връщаща стойност по подразбиране. Функцията връща последния оценен аргумент стойност. | 1 |
IfError( 1/0, 2 ) | Първият аргумент връща стойност на грешка (поради разделяне на нула). Функцията оценява втория аргумент и го връща като резултат. | 2 |
IfError( 10, 20, 30 ) | Първият аргумент не е грешка. Функцията няма други грешки за проверка но няма връщаща стойност по подразбиране. Функцията връща DefaultResult аргумент. | 30 |
IfError( 10, 11, 20, 21, 300 ) | Първият аргумент 10 не е грешка, така че функцията не оценява съответната подмяна на този аргумент 11. Третият аргумент 20 не е грешка също, така че функцията не оценява съответната подмяна на този аргумент 21. Петият аргумент 300 няма съответна подмяна и е резултатът по подразбиране. Функцията връща този резултат, защото формулата не съдържа грешки. | 300 |
IfError( 1/0, Notify( "There was an internal problem" ) ) | Първият аргумент връща стойност на грешка (поради разделяне на нула). Функцията оценява втория аргумент и показва съобщение на потребителя. Върнатата стойност на IfError е възвръщаемата стойност на Уведоми, принудени към същия тип като първия аргумент за IfError (число). | 1 |
Прост IsError
Формула | Описание | Резултат |
---|---|---|
IsError( 1 ) | Аргументът не е грешка. | false |
IsError( Blank() ) | Аргументът е празен, но не е грешка. | false |
IsError( 1/0 ) | Аргументът е грешка. | вярно |
If( IsError( 1/0 ), Notify( "There was an internal problem" ) ) | Аргументът към IsError връща стойност на грешка (поради разделяне на нула). Тази функция се връща вярно, което причинява If да покажете съобщение на потребителя с Notify функция. Върнатата стойност на If е възвръщаемата стойност на Уведоми, принудена към същия тип като първия аргумент за If (булево). | вярно |
Обикновен IsBlankOrError
Формула | Описание | Резултат |
---|---|---|
IsBlankOrError( 1 ) | Аргументът не е грешка или празен. | false |
IsBlankOrError( Blank() ) | Аргументът е празен. | вярно |
IsBlankOrError( 1/0 ) | Аргументът е грешка. | вярно |
Обикновена грешка
В този пример датите се валидират една спрямо друга, което води до грешка, ако има проблем.
If( StartDate > EndDate,
Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )
В този пример е разрешено преминаването на някои грешки, докато други са потиснати и заменени със стойност. В първия случай b ще бъде в състояние на грешка, защото функцията Value има невалиден аргумент. Тъй като това е неочаквано от автора на формулата, то се предава, така че потребителят да го види. Във втория случай, със същата формула, b ще има стойност 0, което води до деление на нула. В този случай авторът на формулата може да знае, че това е приемливо за тази логика, да потисне грешката (не се показва банер) и вместо това да върне -1.
With( {a: 1, b: Value("a")},
IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns an error with Kind = ErrorKind.InvalidArgument
With( {a: 1, b: 0} )
IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns -1
Таблицата AllErrors може да бъде филтрирана като всяка друга таблица. Използва се с функцията Error, очакваните грешки могат да бъдат премахнати, а останалите грешки запазени и докладвани. Например, ако знаехме, че деленето на нула няма да бъде проблем в конкретен контекст, тези грешки биха могли да бъдат филтрирани, оставяйки всички други грешки непокътнати със следната формула:
Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )
Стъпка по стъпка
Добавете Въвеждане на текст контрола и я назовете TextInput1, ако няма това име по подразбиране.
Добавете Етикет контрола и я назовете Label1, ако няма това име по подразбиране.
Задайте формулата за свойството Текст на Label1:
IfError( Value( TextInput1.Text ), -1 )
В TextInput1 въведете 1234.
Label1 ще покаже стойността 1234, тъй като това е валиден вход към функцията Стойност.
В TextInput1 въведете ToInfinity.
Label1 ще покаже стойността -1, тъй като това не е валиден вход към функцията Стойност. Без да обвивате функцията Value с IfError, етикетът няма да показва стойност, тъй като стойността на грешката се третира като празно.