Menu
Coddy logo textTech

tryCatch()로 잡아내기

Coddy R 여정의 논리와 흐름 섹션에 포함된 레슨. 64개 중 53번째.

tryCatch(expr, error = function(e) ...)는 expr을 실행합니다. 오류가 발생하면 핸들러가 대신 실행되고 그 값이 결과가 되며, 스크립트는 계속 실행됩니다:

safe_sqrt <- function(x) {
  tryCatch(sqrt(x), error = function(e) NA)
}
print(safe_sqrt(16))
print(safe_sqrt("a"))
print("still running")

출력:

[1] 4
[1] NA
[1] "still running"

핸들러는 오류를 e로 받고, conditionMessage(e)는 해당 오류의 메시지 텍스트를 반환합니다:

result <- tryCatch(
  stop("file not found"),
  error = function(e) paste("Problem:", conditionMessage(e))
)
print(result)

출력:

[1] "Problem: file not found"

실패할 수 있는 호출만 감싸고, 기본값이나 사용자에게 보여 줄 메시지처럼 유용한 작업을 수행할 수 있는 곳에서 이를 포착하세요:

to_number <- function(s) {
  tryCatch({
    if (s == "") stop("empty input")
    as.integer(s)
  }, error = function(e) -1L)
}
print(to_number("42"))
print(to_number(""))

출력:

[1] 42
[1] -1

반복문에서 tryCatch()를 사용하면 다른 항목들이 계속 처리되는 동안 문제가 있는 항목 하나만 실패하도록 할 수 있습니다:

inputs <- list(4, "x", 9)
for (v in inputs) {
  r <- tryCatch(sqrt(v), error = function(e) "not a number")
  cat(format(v), "->", r, "\n")
}

출력:

4 -> 2 
x -> not a number 
9 -> 3 
challenge icon

챌린지

쉬움

safe_divide(a, b)를 완성하세요. tryCatch()를 사용하세요. 그 안에서 b가 0이면 division by zero 오류를 발생시키고, 그렇지 않으면 a / b를 계산합니다. 핸들러는 Error: 뒤에 메시지를 반환합니다. 결과를 소수점 둘째 자리까지 반올림한 텍스트 3.33 또는 오류 텍스트로 반환하세요.

제공된 코드는 쉼표로 구분된 10/3과 같은 숫자 쌍을 읽고, 각 쌍의 결과를 한 줄에 하나씩 출력합니다.

직접 해보기

safe_divide <- function(a, b) {
  # 여기에 코드를 작성하세요
  ""
}

# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
for (pair in strsplit(input[1], ",")[[1]]) {
  p <- as.numeric(strsplit(pair, "/")[[1]])
  cat(safe_divide(p[1], p[2]), "\n", sep = "")
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

논리와 흐름의 모든 레슨

직접 연습해 보세요: 온라인 R 컴파일러