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/