例外処理

プログラムの実行中にエラーが発生すると、プログラムは中断され異常終了される。これに対して、エラーが生じても、処理を続けるように制御することができる(例外処理)。R で例外処理を行うには try 関数あるいは tryCatch 関数を利用する。

try 関数

ある関数 f を実行し、途中でエラーが発生しても処理を続けたい場合に例外処理を行う。try 関数に f 関数を与えることで、f 関数が実行され、その実行結果が返される。f 関数の処理が正常終了したとき、その結果が返される。一方、異常終了したときは、try-error クラスのオブジェクトが返される。

try 関数の silent 引数に TRUE を与えると、エラーが発生したときエラーメッセージが出力される。FALSE を与えると、エラーメッセージの出力は抑制される。

f <- function(x) {
  if (x >= 0) {
    return (x * x)
  } else {
    stop("ERROR\n")      # x < 0 ならばエラー出力
  }
}


g <- function(x) {
  y <- NULL
  y <- try(f(x), silent = FALSE)   # try で f 関数を実行
  if (class(y) == "try-error") {
    y <- NA                        # f 関数がエラーになった場合は y に -1 を代入
  }
  y
}


g(-10)
## Error in f(x) : ERROR
## [1] NA

g(10)
## [1] 100

tryCatch

tryCatch 関数を用いる場合、エラーだけでなく警告も検知でき、それに対して例外処理を行うことができる。

f <- function(x) {
  if (x <= 0) {
     stop("error!\n")         # x が 0 以下ならばエラー
  } else if (x %% 2 == 0) {
     warning("warning!\n")    # x が偶数ならば警告
  }
}

g <- function(x) {
  y <- 0

  tryCatch({
      # エラーや警告が発生したときに例外処理を行いたいコード
      f(x)
      y <- 1
    }, 
    error = function(e) {    # e にはエラーメッセージが保存されている
      message("ERROR!")
      message(e)           
      y <- 2
    },
    warning = function(e) {  # e には警告文が保存されている
      message("WARNING!")
      message(e) 
      y <- 3
    },
    finally = {              # ここに書かれるコードは必ず実行される
      message("finish.")
      y <- 4
    },
    silent = TRUE
  )
  return (y)
}

g(-10)
## finish.
## ERROR!
## error!
## [1] 4


g(1)
## finish.
## [1] 4

g(2)
## finish.
## WARNING!
## warning!
## [1] 4