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


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

Применимо к: приложениям на основе холста столбцам формул Dataverse классическим потокам приложениям на основе модели Power Pages интерфейсу командной строки Power Platform

Обнаруживает ошибки и предоставляет альтернативное значение или выполняет действие. Создает пользовательскую ошибку или проходит через ошибку.

Заметка

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, чтобы сохранить существующее поведение приложения. До добавления обработки ошибок использовалось пустое значение для представления как значений NULL из баз данных, так и значений ошибок. Обработка ошибок разделяет эти две интерпретации значения пусто, что может изменить поведение существующих приложений, которые продолжают использовать IsBlank.

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

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

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

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

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

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

Синтаксис

Error( ErrorRecord )
Error( ErrorTable )

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

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

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

IsError( Value )
IsBlankOrError( Value )

  • Value — обязательный аргумент. Формула для тестирования.

Примеры

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

Формула Description Результат
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( "Возникла внутренняя проблема" ) ) Первый аргумент возвращает значение ошибки (из-за деления на ноль). Функция вычисляет второй аргумент и отображает сообщение для пользователя. Возвращаемое значение функции IfError представляет собой возвращаемое значение функции Notify, приведенное к типу первого аргумента функции IfError (число). 1

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

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

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

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