Spec-Zone.ru › OpenTofu 1.9

try Функция

try последовательно вычисляет все выражения своих аргументов и возвращает результат первого выражения, вычисление которого не приводит к ошибкам.

Это специальная функция, которая может перехватывать ошибки, возникающие при вычислении аргументов. Это особенно полезно при работе со сложными структурами данных, форма которых на этапе реализации неизвестна.

Например, если данные получены из внешней системы в формате JSON или YAML, а затем декодированы, некоторые атрибуты результата могут быть не заданы. С помощью try можно создать нормализованную структуру данных с предсказуемым типом, чтобы затем удобнее использовать её в других частях конфигурации:

Блок кода
locals {
  raw_value = yamldecode(file("${path.module}/example.yaml"))
  normalized_value = {
    name   = tostring(try(local.raw_value.name, null))
    groups = try(local.raw_value.groups, [])
  }
}

Благодаря приведённым выше выражениям локальных значений в других частях модуля можно обращаться к атрибутам local.normalized_value, не проверяя и не обрабатывая повторно отсутствие атрибутов, которое в противном случае приводило бы к ошибкам.

Функцию try также можно использовать в ситуациях, когда значение может быть задано в двух разных формах, чтобы нормализовать его до наиболее универсальной формы:

Блок кода
variable "example" {
  type = any
}

locals {
  example = try(
    [tostring(var.example)],
    tolist(var.example),
  )
}

Приведённый выше пример позволяет задавать var.example как список или как отдельную строку. Если задана отдельная строка, она будет нормализована в список из одного элемента, содержащий эту строку. Это позволяет выражениям в других частях конфигурации просто исходить из того, что local.example всегда является списком.

В этом втором примере содержатся два выражения, каждое из которых потенциально может завершиться ошибкой. Например, если var.example имеет значение {}, его нельзя преобразовать ни в строку, ни в список. Если try переберёт все заданные выражения и ни одно из них не выполнится успешно, функция вернёт ошибку с описанием всех обнаруженных проблем.

Мы настоятельно рекомендуем использовать try только в специальных локальных значениях, выражения которых выполняют нормализацию. Так обработка ошибок будет сосредоточена в одном месте модуля, а в остальных его частях можно будет использовать простые ссылки на нормализованную структуру, что облегчит чтение кода будущим специалистам по сопровождению.

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

Предупреждение

Функция try предназначена только для краткой проверки наличия атрибутов объектов и их типов. Хотя технически ей можно передать выражение любого типа, мы рекомендуем использовать её только с простыми ссылками на атрибуты и функциями преобразования типов, как показано в примерах выше. Чрезмерное использование try для подавления ошибок приведёт к тому, что конфигурацию будет трудно понять и сопровождать.

Примеры​

Блок кода
> local.foo
{
  "bar" = "baz"
}
> try(local.foo.bar, "fallback")
baz
> try(local.foo.boop, "fallback")
fallback

Функция try не перехватывает ошибки, связанные с конструкциями, заведомо некорректными ещё до вычисления динамических выражений, например с неправильно сформированной ссылкой или ссылкой на необъявленный объект верхнего уровня:

Блок кода
> try(local.nonexist, "fallback")

Error: Reference to undeclared local value

A local value with the name "nonexist" has not been declared.

Связанные функции​

  • can, которая пытается вычислить выражение и возвращает логическое значение, указывающее, удалось ли это.

Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/language/functions/try/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API