这将输出“未发现错误!”两次,
x<-"no error found!"
dontchangex <- function()
{
tryCatch(
{
x<- "break this"+1
},error= function(e)
{
x<-"oh no :("
})
print(x)
}
dontchangex()
print(x)
由于错误范围{}。如何从错误内部访问父作用域? 编辑:我想进入tryCatch的范围,而不是突破到全局范围。也就是说,这应该打印“哦不:(”“没有发现错误!”
答案 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,但是当它出现时我们在相同的范围内创建了自己的错误块