Функции Error, IfError, IsError, IsBlankOrError

Применимо к: Приложениям Canvas Dataverse Столбцам формул Потокам рабочего стола Приложениям на основе моделей Power Pages 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 отображает #ДЕЛ/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 элемента управления Button:

Set( a, 1/0 )

И эта формула в свойстве OnSelect второго элемента управления Button:

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

В приведенном выше примере формулы будет отображаться следующий баннер при последовательном нажатии двух кнопок:

Элемент управления Button активирован, показывая уведомление от функции Notify.

Обычно будет только одна ошибка, с которой FirstError может успешно работать. Однако существуют сценарии, в которых может быть возвращено несколько ошибок. Например, при использовании оператора цепочки формул или функции Concurrent. Даже в таких случаях отчетов FirstError может быть достаточно, чтобы выявить проблему, вместо того, чтобы перегружать пользователя множеством ошибок. Если у вас по-прежнему есть потребность работать с каждой ошибкой по отдельности, вы можете использовать таблицу AllErrors.

IsError

Функция IsError проверяет на значение ошибки.

Возвращаемое значение является логическим true или false.

Использование IsError предотвращает дальнейшую обработку ошибки.

IsBlankOrError

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

При включении обработки ошибок для существующих приложений подумайте о замене функции IsBlank функцией IsBlankOrError, чтобы сохранить существующее поведение приложения. До добавления обработки ошибок для представления как нулевых значений из баз данных, так и значений ошибок использовалось пустое значение. Обработка ошибок разделяет эти две интерпретации значения пусто, что может изменить поведение существующих приложений, которые продолжают использовать IsBlank.

Возвращаемое значение является логическим true или false.

Использование IsBlankOrError предотвращает дальнейшую обработку ошибки.

Используйте функцию Error для создания пользовательской ошибки и сообщения о ней. Например, у вас может быть логика для определения того, допустимо ли какое-либо заданное значение для вашего контекста или нет — что-то не проверяется в случае проблемы автоматически. Вы можете создать и вернуть свою собственную ошибку вместе с Вид и Сообщение, используя ту же запись, описанную выше для функции IfError.

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

Функция Error также может быть передать таблицу ошибок, как это было бы найдено в таблице AllErrors. Используйте Error(AllErrors ), чтобы повторно выдать все ошибки а не только первую.

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

Синтаксис

Ошибка( ErrorRecord )
Ошибка( ТаблицаОшибок )

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

IfError( Значение1, Замена1 [, Значение2 , Replacement2, ... [, DefaultResult ] ] )

  • Значения – обязательны. Формулы, которые необходимо проверить на значение ошибки.
  • Замены – Обязательно. Формулы, которые необходимо вычислить и значения для которых необходимо возвратить, если соответствующие аргументы Value вернули ошибку.
  • DefaultResult – Необязательно. Формулы для оценки, если формула не находит ошибок.

IsError( Значение )
IsBlankOrError( Значение )

  • Значение – Обязательно. Формула для тестирования.

Примеры

Простая функция IfError

Формула Description Результат
ЕслиОшибка( 1, 2 ) Первый аргумент не является ошибкой. У функции нет других ошибок для проверки и нет возвращаемого значения по умолчанию. Функция возвращает последний оцененный аргумент Value. 1
ЕслиОшибка( 1/0, 2 ) Первый аргумент возвращает значение ошибки (из-за деления на ноль). Функция оценивает второй аргумент и возвращает его как результат. 2
ЕслиОшибка( 10, 20, 30 ) Первый аргумент не является ошибкой. У функции нет других ошибок для проверки, но есть возвращаемое значение по умолчанию. Функция возвращает аргумент DefaultResult. 30
ЕслиОшибка( 10, 11, 20, 21, 300 ) Первый аргумент 10 не является ошибкой, поэтому функция не оценивает соответствующую замену этого аргумента 11. Третий аргумент 20 также не является ошибкой, поэтому функция не оценивает соответствующую замену этого аргумента 21. Пятый аргумент 300 не имеет соответствующей замены и является результатом по умолчанию. Функция возвращает этот результат, потому что формула не содержит ошибок. 300
IfError( 1/0, Notify( "Возникла внутренняя проблема") ) Первый аргумент возвращает значение ошибки (из-за деления на ноль). Функция вычисляет второй аргумент и отображает сообщение для пользователя. Возвращаемое значение функции IfError представляет собой возвращаемое значение функции Notify, приведенное к типу первого аргумента функции IfError (число). 1

Простая функция IsError

Формула Описание Результат
Ошибка( 1 ) Аргумент не является ошибкой. ЛОЖЬ
IsError( Пусто() ) Аргумент пустой, но не ошибка. ЛОЖЬ
Ошибка (1/0) Аргумент является ошибкой. истинный
If( IsError( 1/0 ), Notify( "Возникла внутренняя проблема" ) ) Аргумент функции IsError возвращает значение ошибки (из-за деления на ноль). Эта функция возвращает true, что приводит к тому, что If отображает сообщение для пользователя с помощью функции Notify. Возвращаемое значение функции If представляет собой возвращаемое значение функции Notify, приведенное к типу первого аргумента функции If (логическое значение). истинный

Простой пример IsBlankOrError

Формула Description Результат
IsBlankOrError( 1 ) Аргумент не является ошибкой и не пустой. ЛОЖЬ
IsBlankOrError( Пустой() ) Аргумент пуст. истинный
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 ) )

Пошаговое руководство

  1. Добавьте элемент управления Text input с именем TextInput1 (возможно, такое имя будет указано по умолчанию).

  2. Добавьте элемент управления Label с именем Label1 (возможно, такое имя будет указано по умолчанию).

  3. Установите следующую формулу для свойства Text элемента управления Label1:

    IfError( Value( TextInput1.Text ), -1 )
    
  4. В поле TextInput1 введите 1234.

    Label1 показывает значение 1234 , поскольку это допустимые входные данные для функции Value.

  5. В поле TextInput1 введите ToInfinity.

    Label1 показывает значение -1 , поскольку это недопустимые входные данные для функции Value. Если не заключить функцию Value в функцию IfError, в метке не будет отображаться значение, так как ошибочное значение считается пустым.

См. также

Формула ссылки для Power Apps