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은 표현식의 평가를 시도하고 성공했는지 나타내는 불리언 값을 반환해요.