背景

在使用R进行循环操作时,出现错误,为了对错误进行分析,使用tryCatch()函数抓取处理错误

使用

tryCatch常用的三种用法:

抓取错误

  1. tryCatch(libray(test), error = function(e){print("出现错误")} )
  1. ## [1] "出现错误"

释义:当加载test包时,出现错误,执行error函数

这里很适合在循环中出现错误的情况,可以对错误的循环结果进行赋值

抓取警告和错误

  1. tryCatch(stop("test"), warning = function(w){print("出现警告")},
  2. finally={
  3. print("test")
  4. })
  5. ## Error in doTryCatch(return(expr), name, parentenv, handler) : test
  6. ## [1] "test"

释义:执行语句出错,打印出错误,并执行finally函数

如果单独只有warning函数,则只是打印错误

继续执行

  1. tryCatch(a = 1, finally={print("我是个测试")})
  2. ## Error in tryCatchList(expr, classes, parentenv, handlers) :
  3. ## argument "expr" is missing, with no default
  4. ## [1] "我是个测试"

finally函数无论错与对都会执行

封装函数

  1. log_calculator <- function(x){
  2. tryCatch(
  3. expr = {
  4. message(log(x))
  5. message("Successfully executed the log(x) call.")
  6. },
  7. error = function(e){
  8. message('Caught an error!')
  9. print(e)
  10. },
  11. warning = function(w){
  12. message('Caught an warning!')
  13. print(w)
  14. },
  15. finally = {
  16. message('All done, quitting.')
  17. }
  18. )
  19. }

测试结果如下:

  • 如果x是有效数字,则exprfinally被执行:
  1. log_calculator(-10)
  1. ## Caught an warning!
  1. ## <simpleWarning in log(x): NaNs produced>
  1. ## All done, quitting.
  • 如果x不是有效数字,则expr会报错,warningfinally被执行:
  1. log_calculator("10")
  1. ## Caught an error!
  1. ## <simpleError in log(x): non-numeric argument to mathematical function>
  1. ## All done, quitting.