Поділитися через


Функції Error, IfError, IsError, IsBlankOrError

Застосовується до: стовпців Dataverse формул програм Canvas Потоків робочого столу Програм, Power Platform керованих моделлю, CLI

Виявлення помилок і надання альтернативного значення або виконання дії. Створіть настроювану помилку або передайте повідомлення про помилку.

Нотатка

IfError

Функція IfError перевіряє значення, доки не знайде помилку. У разі виявлення функцією помилки вона обчислює та повертає відповідне значення заміни і припиняє подальше оцінювання. Також може забезпечуватися значення за замовчуванням, якщо не буде знайдено помилок. Структура функції IfError нагадує структуру функції If: функція IfError виконує перевірку на наявність помилок, а функція If – на наявність значення true.

За допомогою функції 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" )
)

У разі виникнення проблеми з функцією Patch для DS1 спочатку виконується функція Notify. Подальша обробка, включно з другою функцією Patch для DS2, не відбувається. Якщо перша функція Patch виконується успішно, буде виконано другу функцію Patch.

Якщо вказано необов’язковий аргумент DefaultResult, він повертатиметься, якщо не буде виявлено помилок. Якщо його не вказати, повертатиметься останній аргумент Value.

Спираючись на останній приклад, значення, яке повертає функція IfError, можна перевірити для виявлення будь-яких проблем.

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" );  false,
    Patch( DS2, ... ), Notify( "problem in the second action" ); false,
    true
)

Сумісність за типом

Функція IfError поверне значення одного зі своїх аргументів. Типи всіх значень, які може повертати функція IfError, мають бути сумісними.

В останньому прикладі функція Patch поверне запис, не сумісний із логічними значеннями, що використовуються для формул Replacement або аргументу DefaultResult. Це нормально, оскільки не існує ситуацій, у яких значення, що повертаються в результаті викликів функції Patch, поверталися б функцією 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 може повертати помилку, якщо Replacement або DefaultResult є помилкою.

FirstError / AllErrors

У формулах заміни відомості про виявлені помилки можна переглянути в записі FirstError і таблиці AllErrors. AllErrors – це таблиця записів відомостей, де FirstError є ярликом для першого запису цієї таблиці. FirstError завжди повертає те саме значення, що й First( AllErrors ).

Записи помилок містять:

Поле Ввести Опис
Тип Перелічення ErrorKind (число) Категорія помилки.
Повідомлення Текстовий рядок Повідомлення про помилку, яке підходить для відображення кінцевому користувачеві.
Мова оригіналу Текстовий рядок Розташування, в якому сталася помилка, яке використовується для звітування. Наприклад, якщо формула прив’язана до властивості елемента керування, вона відображатимуться у формі ControlName.PropertyName.
Виявлення Текстовий рядок Розташування, де помилка стала видимою користувачу, яке використовується для звітування. Наприклад, якщо формула прив’язана до властивості елемента керування, вона відображатимуться у формі ControlName.PropertyName.
Докладно Записати Відомості про помилку. Наразі відомості надаються лише щодо помилок мережі. Цей запис містить HttpStatusCode із кодом стану HTTP та HttpResponse із текстом відповіді з’єднувача або служби.

Наприклад, розгляньте застосування нижченаведеної формули як властивості OnSelect елемента керування Кнопка.

Set( a, 1/0 )

І ця формула у властивості OnSelect другого елемента керування "Кнопка":

IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )

Наведений вище приклад формули відображатиме наведений нижче банер, якщо послідовно натиснути обидві кнопки:

Активований елемент керування «Кнопка», що відображає сповіщення від функції «Notify».

Зазвичай FirstError може ефективно працювати лише з однією помилкою. Проте існують сценарії, в яких може повертатися кілька помилок. Наприклад, під час використання оператора побудови ланцюжка формул або функції Concurrent . Навіть у цих ситуаціях звітування firstError може виявити проблему, а не перевантажувати користувача кількома помилками. Якщо все ще потрібно працювати з кожною помилкою окремо, можна скористатися таблицею AllErrors.

IsError

Функція IsError виконує перевірку на наявність значення помилки.

Функція повертає логічне значення – true або false.

Використання функції IsError запобігатиме подальшій обробці помилки.

IsBlankOrError

Функція IsBlankOrError перевіряє пусте значення або значення помилки та є еквівалентом Or( IsBlank( X ), IsError( X ) ).

При вмиканні обробки помилок для існуючих програм розгляньте можливість заміни IsBlank на IsBlankOrError для запобігання помилкам програми. Перед додаванням обробки помилок пусте значення було використано, щоб представляти Null-значення з баз даних і значень помилок. Обробка помилок розділяє ці дві інтерпретації пустих, що може змінити поведінку наявних програм, які продовжують використовувати IsBlank.

Функція повертає логічне значення – true або false.

Використання IsBlankOrError запобігає подальшій обробці помилки.

Щоб створити настроювану помилку й звітувати про неї, скористайтеся функцією Error. Наприклад, може існувати логіка для визначення, чи припустиме будь-яке значення для контексту чи ні – те, що не перевіряється на наявність проблеми автоматично. Можна створити та повернути власну помилку із заповненими даними Тип і Повідомлення, використовуючи той самий запис, описаний вище для функції IfError.

У контексті IfError IfError скористайтеся функцією Error , щоб повторно згенерувати або пропустити помилку. Наприклад, логіка в IfError може вирішити, що в деяких випадках помилку можна безпечно ігнорувати, але в інших випадках важливо повідомити про помилку. У IfError або App.OnError скористайтеся Error( FirstError ), щоб пропустити помилку.

Для функції Error також можна передати таблицю помилок, яку можна знайти в таблиці AllErrors. Скористайтеся Error( AllErrors ), щоб повторно згенерувати всі помилки, а не тільки першу.

Пустий запис або пуста таблиця, передана до Error, не призводить до помилки.

Синтаксис

Error( ErrorRecord )
Error( ErrorTable )

  • ErrorRecord – обов’язковий аргумент. Запис відомостей про помилку, включно з полями Тип, Message тощо. Тип – обов’язкове поле. FirstError можна передати безпосередньо.
  • ErrorTable – обов’язковий аргумент. Таблиця записів відомостей про помилки. AllErrors можна передати безпосередньо.

IfError( Value1, Replacement1 [, Value2, Replacement2, ... [, DefaultResult ] ] )

  • Value(s) – обов’язковий аргумент. Формула або формули, які потрібно перевірити на наявність значення помилки.
  • Replacement(s) – обов’язковий аргумент. Формули для обчислення і значення для повернення, якщо відповідні аргументи Value повернуть помилку.
  • DefaultResult – необов’язковий аргумент. Формули, які потрібно обчислити, якщо не буде знайдено помилок.

IsError( Value )
IsBlankOrError( Значення )

  • Value — обов'язковий аргумент. Формула для перевірки.

Приклади

Проста функція «IfError»

Формула Опис Результат
IfError( 1, 2 ) Перший аргумент не є помилкою. Більше немає помилок для перевірки та значень за замовчуванням для повернення функцією. Функція повертає останній обчислений аргумент Value. 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" ) ) Перший аргумент повертає значення помилки (через ділення на нуль). Функція обчислює другий аргумент і відображає повідомлення для користувача: «There was an internal problem» (Виникла внутрішня проблема). Значення, повернуте функцією IfError, є значенням, що повертається функцією Notify, приведеним до типу першого аргументу функції IfError (число). 1

Проста функція «IsError»

Формула Опис Результат
IsError( 1 ) Аргумент не є помилкою. хибність
IsError( Blank() ) Аргумент пустий, але не є помилкою. хибність
IsError( 1/0 ) Аргумент є помилкою. True
If( IsError( 1/0 ), Notify( "There was an internal problem" ) ) Перший аргумент функції IsError повертає значення помилки (через ділення на нуль). Ця функція повертає значення «істина», що призводить If до відображення повідомлення для користувача із функцією Notify. Значення, повернуте функцією If є значенням, що повертається функцією Notify, приведеним до типу першого аргументу функції If (логічне значення). True

Simple IsBlankOrError

Формула Опис Результат
IsBlankOrError( 1 ) Аргумент не пустий і не є помилкою. хибність
IsBlankOrError( Blank() ) Аргумент пустий. True
IsBlankOrError( 1/0 ) Аргумент є помилкою. True

Проста помилка

У цьому прикладі дати перевіряються відносно один одного, внаслідок чого виникає помилка в разі виникнення проблеми.

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 ) )

Покрокові інструкції

  1. Додайте елемент керування Ввід тексту та назвіть його TextInput1 (ВвідТексту1), якщо це ім’я не було присвоєно йому за замовчуванням.

  2. Додайте елемент керування Підпис та назвіть його Label1 (Підпис1), якщо це ім’я не було присвоєно йому за замовчуванням.

  3. Настройте властивість Text елемента керування з ім’ям Label1 відповідно до нижчезазначеної формули.

    IfError( Value( TextInput1.Text ), -1 )
    
  4. В елементі керування TextInput1 уведіть 1234.

    Елемент керування Label1 відобразить значення 1234, оскільки воно є припустимим для функції «Value».

  5. В елементі керування TextInput1 уведіть ToInfinity (До нескінченності).

    Елемент керування Label1 відобразить значення -1, оскільки воно є неприпустимим для функції «Value». Якщо не вкласти функцію «Value» у функцію «IfError», підпис не відображатиме значень, оскільки значення помилки вважатиметься пустим.

Статті за темою:

Посилання на формулу для Power Apps