R中的tryCatch无法正常工作

Err*_*tyl 3 r try-catch

我有以下R代码:

tryCatch( {pre_symbol=read.table(file=filePre,header=FALSE,sep=",")}
         , error = function(e) {loadError = TRUE} )
Run Code Online (Sandbox Code Playgroud)

当输入文件(filePre)为空时,tryCatch不会将全局变量loadError设置为TRUE.这会在我的代码中创建问题(当loadError == false时执行的代码假定filePre不为空)tryCatch应该阻止它.但是,当我删除tryCatch语句并尝试通过read.Table加载时,我收到错误

read.table出错(file = filePre,header = FALSE,sep =","):输入中没有可用的行

在这种情况下,这是预期的.我不知道为什么这不起作用.它适用于我的集合中的大多数其他文件.

ags*_*udy 8

您应该<<-在此处使用全局赋值运算符,例如:

loadError = FALSE
toto <- function(){

  tryCatch(stop("dummy error"),error=function(e)loadError <<- TRUE)
}

> toto()
> loadError
[1] TRUE
Run Code Online (Sandbox Code Playgroud)


Han*_*nsi 5

避免使用“全局分配”的一些替代方法(除非在特定情况下它不是真正的全局):

使用存在:

tryCatch({
    stop("Error")
    pre_symbol <- "blah"
}, error = function(e) {
    print(e)
})

if(exists("pre_symbol")){
    print(pre_symbol)
}
Run Code Online (Sandbox Code Playgroud)

使用 NULL:

pre_symbol <- NULL
tryCatch({
    stop("Error")
    pre_symbol <- "blah"
}, error = function(e) {
    print(e)
})

if(!is.null(pre_symbol)){
    print(pre_symbol)
}
Run Code Online (Sandbox Code Playgroud)

使用选项:

options(myLoadError=FALSE)
tryCatch({
    stop("Error")
    pre_symbol <- "blah"
}, error = function(e) {
    print(e)
    options(myLoadError=TRUE)
})

if(!isTRUE(getOption("myLoadError"))){
    print(pre_symbol)
}
Run Code Online (Sandbox Code Playgroud)

使用环境:

loadErrors <- new.env(parent=emptyenv())
tryCatch({
    stop("Error")
    pre_symbol <- "blah"
}, error = function(e) {
    print(e)
    loadErrors[["pre_symbol"]] <- TRUE
})

if(!isTRUE(loadErrors[["pre_symbol"]])){
    print(pre_symbol)
}
Run Code Online (Sandbox Code Playgroud)

我个人倾向于使用 NULL 模式。