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 챌린지
쉬움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 = "")
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
논리와 흐름의 모든 레슨
직접 연습해 보세요: 온라인 R 컴파일러