Menu
Coddy logo textTech

tryCatch()で捕捉する

CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 53/64。

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() によって、他の項目の処理を続けながら、1つの不正な項目だけを失敗させることができます。

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: に続けてメッセージを返します。結果は小数点以下2桁に丸めたテキスト(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オンラインコンパイラ