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