Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
| Functions | Применимо к |
|---|---|
| Error IfError IsError |
|
| IsBlankOrError |
|
Обнаруживает ошибки и предоставляет альтернативное значение или выполняет действие. Создает пользовательскую ошибку или проходит через ошибку.
Заметка
Если приложение отключило функцию Управление ошибками на уровне формул в разделе Настройки>Обновления>Удалено, эти функции не будут работать правильно.
IfError
Функция IfError проверяет значения до тех пор, пока не обнаружит ошибку. Если функция обнаруживает ошибку, она оценивает и возвращает соответствующее значение замены и останавливает дальнейшую оценку. Также можно указать значение по умолчанию, если ошибок не обнаружено. Структура IfError напоминает функцию If : IfError проверяет наличие ошибок, а если тесты для 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 если функция "Замена " или DefaultResult является ошибкой.
FirstError / AllErrors
Внутри формул замены информация о найденных ошибках доступна в записи FirstError и в таблице AllErrors. AllErrors — это таблица записей с информацией об ошибках, где FirstError является ярлыком для первой записи этой таблицы. FirstError всегда возвращает то же значение, что и First( AllErrors ).
Error К записям относятся:
| Поле | Тип | Описание |
|---|---|---|
| Добрый | Перечисление 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 ) )
В приведенном выше примере формулы будет отображаться следующий баннер при последовательном нажатии двух кнопок:
Обычно будет только одна ошибка, с которой FirstError может успешно работать. Однако существуют сценарии, в которых может быть возвращено несколько ошибок. Например, при использовании оператора цепочки формул или функции Concurrent. Даже в таких случаях отчетов FirstError может быть достаточно, чтобы выявить проблему, вместо того, чтобы перегружать пользователя множеством ошибок. Если у вас по-прежнему есть потребность работать с каждой ошибкой по отдельности, вы можете использовать таблицу AllErrors.
IsError
Тесты IsError функции для значения ошибки.
Возвращаемое значение является логическим true или false.
Использование IsError предотвращает дальнейшую обработку ошибки.
IsBlankOrError
Функция IsBlankOrError проверяет пустое значение или значение ошибки и эквивалентно Or( IsBlank( X ), IsError( X ) ).
При включении обработки ошибок для существующих приложений рекомендуется заменить IsBlankIsBlankOrError на сохранение существующего поведения приложения. До добавления обработки ошибок для представления как нулевых значений из баз данных, так и значений ошибок использовалось пустое значение. Error обработка разделяет эти две интерпретации пустых значений, которые могут изменить поведение существующих приложений, которые продолжают использовать IsBlank.
Возвращаемое значение является логическим true или false.
Использование IsBlankOrError предотвращает дальнейшую обработку ошибки.
Используйте функцию Error , чтобы создать и сообщить о пользовательской ошибке. Например, у вас может быть логика для определения того, допустимо ли какое-либо заданное значение для вашего контекста или нет — что-то не проверяется в случае проблемы автоматически. Вы можете создать и вернуть собственную ошибку, в комплекте с типом и сообщением, используя ту же запись, описанную выше для IfError функции.
В контексте IfErrorиспользуйте Error функцию для повторного увеличения или передачи ошибки. Например, логика может IfError решить, что в некоторых случаях ошибка может быть безопасно проигнорирована, но в других случаях эта ошибка важна для отправки. В IfErrorприложении или App.OnError используйте Error(FirstError) для передачи ошибки.
Функцию Error также можно передать в таблицу ошибок, как и в таблице AllErrors . Используйте Error(AllErrors) для повторного увеличения всех ошибок и не только первых.
Пустая запись или пустая таблица, передаваемая без Error ошибок.
Синтаксис
Error( ErrorRecord )
Error( ErrorTable )
- ErrorRecord – Обязательно. Error сведения о записях, включая "Тип", "Сообщение" и другие поля. Вид обязателен. FirstError можно передать напрямую.
- ErrorTable – Обязательно. Таблица записей информации об ошибках. AllErrors можно передавать напрямую.
IfError( Value1, Replacement1 [, Value2, Replacement2, ... [, DefaultResult ] ] )
- Значения – обязательны. Формулы, которые необходимо проверить на значение ошибки.
- Замены – Обязательно. Формулы, которые необходимо вычислить и значения для которых необходимо возвратить, если соответствующие аргументы Value вернули ошибку.
- DefaultResult – Необязательно. Формулы для оценки, если формула не находит ошибок.
IsError( Значение )
IsBlankOrError( Значение )
- Значение – Обязательно. Формула для тестирования.
Примеры
Простой 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, Уведомление( "Возникла внутренняя проблема" ) ) | Первый аргумент возвращает значение ошибки (из-за деления на ноль). Функция вычисляет второй аргумент и отображает сообщение для пользователя. Возвращаемое значение — возвращаемое значение IfErrorуведомления, принученное к тому же типу, что и первый аргумент IfError (число). | 1 |
Простой IsError
| Формула | Описание | Результат |
|---|---|---|
| IsError( 1 ) | Аргумент не является ошибкой. | ЛОЖЬ |
| IsError( Blank() ) | Аргумент пустой, но не ошибка. | ЛОЖЬ |
| IsError( 1/0 ) | Аргумент является ошибкой. | истинный |
| If( IsError(1/0), Notify( "Возникла внутренняя проблема") ) | Аргумент, возвращающий IsError значение ошибки (из-за деления по нулю). Эта функция возвращает true, что приводит к тому, что If отображает сообщение для пользователя с помощью функции Notify. Возвращаемое значение функции If представляет собой возвращаемое значение функции Notify, приведенное к типу первого аргумента функции If (логическое значение). | истинный |
Простой IsBlankOrError
| Формула | Описание | Результат |
|---|---|---|
| IsBlankOrError( 1 ) | Аргумент не является ошибкой и не пустой. | ЛОЖЬ |
| IsBlankOrError( Blank() ) | Аргумент пуст. | истинный |
| IsBlankOrError( 1/0 ) | Аргумент является ошибкой. | истинный |
Простой Error
В этом примере даты проверяются относительно друг друга, что приводит к ошибке в случае возникновения проблемы.
If( StartDate > EndDate,
Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )
В этом примере некоторым ошибкам разрешено проходить, в то время как другие отменяются и заменяются значением. В первом случае, б находится в состоянии ошибки, поскольку Ценить функция имеет недопустимый аргумент. Поскольку это непредвиденно для составителя формулы, это передается так, чтобы пользователь это видел. Во втором случае, по той же формуле, б имеет значение 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 ) )
Пошаговое руководство
Добавьте элемент управления Text input с именем TextInput1 (возможно, такое имя будет указано по умолчанию).
Добавьте элемент управления Label с именем Label1 (возможно, такое имя будет указано по умолчанию).
Установите следующую формулу для свойства Text элемента управления Label1:
IfError( Value( TextInput1.Text ), -1 )В поле TextInput1 введите 1234.
Label1 показывает значение 1234 поскольку это допустимый вход для функции Value.
В поле TextInput1 введите ToInfinity.
Label1 показывает значение -1 поскольку это недопустимые входные данные для функции Value. Без упаковки функции "Значение" IfErrorметка не будет отображать значение, так как значение ошибки рассматривается как пустое.