使用tryCatch()的简单示例

时间:2017-05-02 18:05:07

标签: r error-handling

我正在努力弄清楚如何使用DECLARE @Date datetime DECLARE @SevenBefore datetime DECLARE @SevenAfter datetime SET @Date = CreatedDate SET @SevenBefore = DATEADD(day,-7,@Date) SET @SevenAfter = DATEADD(day,7,@Date) SELECT * FROM <table> WHERE <table> BETWEEN @SevenBefore AND @SevenAfter 来抛出错误。我已经阅读了几篇博客文章,Hadley在高级R和几篇SO帖子中的写作。但由于某种原因,它还没有沉没。我的虚拟示例如下:当向量的长度小于160时,停止执行该函数,而是向用户提供错误消息。很简单的东西,但显然不适合我。我觉得这个功能应该是这样的:

tryCatch()

但是当我运行该函数时,错误没有被捕获:

dummy_fun <-  function(x) {
    tryCatch(length(x) < 160 ,
             error = function(e) {
               print("An error message")
             }
    )
  return(x*2)
}

即使长度明显小于160.

>dummy_fun(airquality$Ozone)

  [1]  82  72  24  36  NA  56  46  38  16  NA  14  32  22  28  36  28  68  12  60  22   2  22   8  64  NA  NA  NA  46  90 230  74
 [32]  NA  NA  NA  NA  NA  NA  58  NA 142  78  NA  NA  46  NA  NA  42  74  40  24  26  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 270
 [63]  98  64  NA 128  80 154 194 194 170  NA  20  54  NA  14  96  70 122 158 126  32  NA  NA 160 216  40 104 164 100 128 118  78
 [94]  18  32 156  70 132 244 178 220  NA  NA  88  56 130  NA  44 118  46  62  88  42  18  NA  90 336 146  NA 152 236 168 170 192
[125] 156 146 182  94  64  40  46  42  48  88  42  56  18  26  92  36  26  48  32  26  46  72  14  28  60  NA  28  36  40

如果我使用>length(airquality$Ozone) < 160 [1] TRUE stop,它会停止代码,但会自动打开调试窗口(至少在RStudio中),而我只是喜欢错误,告诉用户有一个错误:

stopifnot

并且停止:

dummy_fun2 <-  function(x) {
  stop(length(x) < 160 ,"An error message")
  return(x*2)
}

dummy_fun2(airquality$Ozone)

所以,我很好奇是否有人知道我在这里做错了什么。我确定我会将其标记为重复的帖子,但我真的很遗憾。

2 个答案:

答案 0 :(得分:2)

dummy_fun <-  function(x) {
  if (length(x) < 160) stop("x is not big enough")
  return(x*2)
}
dummy_fun(airquality$Ozone)
dummy_fun(rep(1, 50))
dummy_fun(rep(1, 500))

答案 1 :(得分:1)

这是你在找什么?

onError <- function(){
  print("An error message")
}

  dummy_fun <-  function(x) {
    tryCatch(length(x) < 160 , finally = onError())
    return(x*2)
  }
dummy_fun(airquality$Ozone)
  

dummy_fun(airquality $臭氧)

[1] "An error message"
  [1]  82  72  24  36  NA  56  46  38  16  NA  14  32  22  28  36  28  68  12  60  22   2  22   8  64  NA  NA  NA  46  90 230  74  NA  NA  NA
 [35]  NA  NA  NA  58  NA 142  78  NA  NA  46  NA  NA  42  74  40  24  26  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 270  98  64  NA 128  80 154
 [69] 194 194 170  NA  20  54  NA  14  96  70 122 158 126  32  NA  NA 160 216  40 104 164 100 128 118  78  18  32 156  70 132 244 178 220  NA
[103]  NA  88  56 130  NA  44 118  46  62  88  42  18  NA  90 336 146  NA 152 236 168 170 192 156 146 182  94  64  40  46  42  48  88  42  56
[137]  18  26  92  36  26  48  32  26  46  72  14  28  60  NA  28  36  40