try 함수

try 함수

try 는 모든 인자 표현식을 차례로 평가해서, 오류를 만들지 않는 첫 번째 표현식의 결과를 반환해요.

출처: 문서

본문

try 는 모든 인자 표현식을 차례로 평가해서 오류를 만들지 않는 첫 번째 표현식의 결과를 반환해요. 이 함수는 인자를 평가할 때 발생하는 오류를 잡아낼 수 있는 특별한 함수로, 구현 시점에 형태를 잘 알 수 없는 복잡한 데이터 구조를 다룰 때 특히 유용해요.

예를 들어 외부 시스템에서 데이터를 JSON이나 YAML 형식으로 가져와 디코딩하면, 그 결과에 값이 항상 설정된다고 보장할 수 없는 속성이 있을 수 있어요. try 를 사용해서 예측 가능한 타입을 가진 정규화된 데이터 구조를 만들 수 있고, 그 구조는 구성의 다른 곳에서 더 편리하게 사용할 수 있게 돼요:

locals {
  raw_value = yamldecode("${path.folder}/example.yaml")
  normalized_value = {
    name   = tostring(try(local.raw_value.name, null))
    groups = try(local.raw_value.groups, [])
  }
}

위의 local 값 표현식을 쓰면 폴더의 다른 곳에 있는 구성은 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 는 정규화를 수행하는 특별한 local 값에서만 쓰는 것을 강력히 권해요. 그래야 오류 처리가 폴더의 단일 위치에 국한되고, 폴더의 나머지 부분은 정규화된 구조를 단순히 참조할 수 있어서 미래의 유지보수자가 더 읽기 쉬워지기 때문이에요.

try 함수는 런타임까지 알 수 없는 데이터에 접근할 때 생기는 동적인 오류만 잡아서 처리할 수 있어요. 잘못된 형식의 참조처럼 어떤 입력에 대해서든 유효하지 않음이 증명될 수 있는 표현식과 관련된 오류는 잡지 못해요.

주의: try 함수는 객체 속성의 존재와 타입을 간결하게 검사하기 위해 쓰도록 의도됐어요. 기술적으로는 어떤 종류의 표현식이든 받지만, 위 예시처럼 간단한 속성 참조와 타입 변환 함수와 함께만 사용하는 것을 권장해요. 오류를 억제하려고 try 를 과용하면 이해하고 유지보수하기 어려운 구성이 돼요.

Examples

> 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.

더 알아보기 (Learn more)

  • can 은 표현식의 평가를 시도하고 성공했는지 나타내는 불리언 값을 반환해요.