Spec-Zone.ru › OpenTofu 1.12

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.12/language/functions/try/

Spec-Zone.ru

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