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