tryCatch错误范围{}

时间:2014-06-13 13:29:41

标签: r

这将输出“未发现错误!”两次,

x<-"no error found!"
dontchangex <- function()
{
  tryCatch(
    {
      x<- "break this"+1  
    },error= function(e)
    {
      x<-"oh no :("
    })
  print(x)
}
dontchangex()
print(x)

由于错误范围{}。如何从错误内部访问父作用域? 编辑:我想进入tryCatch的范围,而不是突破到全局范围。也就是说,这应该打印“哦不:(”“没有发现错误!”

2 个答案:

答案 0 :(得分:4)

使用<<-

x<-"no error found!"
tryCatch(
  {
    x<- "break this"+1  
  },error= function(e)
  {
    x <<- conditionMessage(e)
  })
print(x)

但我想知道用例是什么?也许你想让用户知道出了什么问题,但是要使用一些哨兵,以便你可以继续处理。然后你可能想要将错误强制转换为不太严重的错误,可以是warning()或message(),并从tryCatch()返回sentinel

f = function() {
    if (runif(1) > .8) stop("oops")
    TRUE
}

g = function() {
    ## on error, warn user but continue with sentinel 'FALSE'
    tryCatch(f(), error=function(err) {
        warning(conditionMessage(err))
        NA
    })
}

> options(warn=1)
> replicate(10, g())
Warning in value[[3L]](cond) : oops
Warning in value[[3L]](cond) : oops
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE NA NA  TRUE  TRUE

如果您关注范围,那么

x <- 1
fun = function() {
    x <- "OK"
    tryCatch(stop("oops"), error=function(e) x <<- conditionMessage(e))
    x
}

> fun()
[1] "oops"
> x
[1] 1

表明<<-分配给封闭环境的(层次结构)中的第一个匹配符号,因​​此不一定在全局环境中。

&#39;圈地&#39;环境是指定义功能的环境,而不是父框架。或调用函数的环境。对这些原则的理解的一个或多或少的挑战性测试是采取这个

f = function() {
    x <- 0
    function() {
        tryCatch({
            stop("oops")
        }, error=function(e) {
            x <<- conditionMessage(e)
        })
        ls()
    }
}

并解释以下行为

> f0 <- f()
> environment(f0)[["x"]]
[1] 0
> f0 <- f()
> environment(f0)[["x"]]
[1] 0
> f0()
character(0)
> environment(f0)[["x"]]
[1] "oops"
> x
Error: object 'x' not found

答案 1 :(得分:1)

x<-"no error found!"
dontchangex <- function()
{
  errorFound <- TRUE
  tryCatch(
    {
      x<- "break this"+1  
      errorFound <- FALSE
    },error= function(e){}
  )
  if(errorFound) x<-"oh no :("
  print(x)
}
dontchangex()
print(x)

errorFound只有在没有中断时才设置为false,但是当它出现时我们在相同的范围内创建了自己的错误块