R 无法尝试捕获多个错误

Posted

技术标签:

【中文标题】R 无法尝试捕获多个错误【英文标题】:R cannot trycatch multiple errors 【发布时间】:2021-06-12 04:46:40 【问题描述】:

我想在超时错误中捕获无效输入错误。我写的脚本如下。但是,在这种情况下超时不起作用,程序永远运行。任何人都可以请检查并让我知道如何解决它吗?谢谢。

for (lb in 1:100) 
  rs <- tryCatch(
          expr = 
            cat("helloworld", "\n");
            withTimeout(
              rs_son = tryCatch(
                expr = 
                  flag = FALSE
                  cat("start solnl", "\n");
                  ret = solnl(X, objfun = obj, confun = con, lb=lb, ub=ub);
                  cat("finish solnl", "\n");
                ,
                error = function(e) flag <- TRUE
              )
              if(flag) next
            ,
            timeout = 10)
          ,
          TimeoutException = function(ex) 
            cat("Timeout. Skipping.\n")
          
        )

更清楚地说,这就是我想要实现的目标。无论这是对 solnl 函数的无效输入错误还是超时错误,for 循环都应该继续。

【问题讨论】:

【参考方案1】:

这里有多个问题。第一,没有循环调用next,第二,flag只定义在错误处理函数内部,不在tryCatch()之外,第三,外部tryCatch()在这里没有影响。

我添加了一些进一步的 cat 消息,希望能对正在发生的事情有所了解

编辑:用正确的 for 循环更新答案

set.seed(0)
rs <- character()
for (lb in 1:10) 
  
  rs[lb] <- R.utils::withTimeout(
    rs_son = tryCatch(
      expr = 
        flag <- FALSE # has no impact
        Sys.sleep(sample(0:2, size = 1))
        cat("start solnl", "\n")
        ret = solnl(X, objfun = obj, confun = con, lb=lb, ub=ub)
        cat("finish solnl", "\n")
      ,
      error = function(e) 
        cat(as.character(e))
        flag <- TRUE # equals return(TRUE)
      
    )
    if(rs_son) 
      return("NEXT OUT")
    
    return("OUT")
  ,
  timeout = 1)
  
  

#> Error in Sys.sleep(sample(0:2, size = 1)): reached elapsed time limit
#> start solnl 
#> Error in solnl(X, objfun = obj, confun = con, lb = lb, ub = ub): could not find function "solnl"
#> Error in Sys.sleep(sample(0:2, size = 1)): reached elapsed time limit
#> start solnl 
#> Error in solnl(X, objfun = obj, confun = con, lb = lb, ub = ub): could not find function "solnl"
#> Error in Sys.sleep(sample(0:2, size = 1)): reached elapsed time limit
#> start solnl 
#> Error in solnl(X, objfun = obj, confun = con, lb = lb, ub = ub): could not find function "solnl"
#> Error in Sys.sleep(sample(0:2, size = 1)): reached elapsed time limit
#> Error in Sys.sleep(sample(0:2, size = 1)): reached elapsed time limit
#> start solnl 
#> Error in solnl(X, objfun = obj, confun = con, lb = lb, ub = ub): could not find function "solnl"
#> start solnl 
#> Error in solnl(X, objfun = obj, confun = con, lb = lb, ub = ub): could not find function "solnl"

rs
#>  [1] "NEXT OUT" "NEXT OUT" "NEXT OUT" "NEXT OUT" "NEXT OUT" "NEXT OUT"
#>  [7] "NEXT OUT" "NEXT OUT" "NEXT OUT" "NEXT OUT"

【讨论】:

非常感谢您的回复。我没有在开头粘贴 for 循环是我的错(我已经更新了问题)。由于有一个 for 循环,我不能使用 return 命令。您能否提供更多见解如何解决?我的目标是使外部 trycatch() 工作。 更清楚地说,这就是我想要实现的目标。无论这是 solnl 函数的无效输入错误还是超时错误,for 循环都应该继续。 我更新了答案,但仍然看不到外部 tryCatch 的必要性。如您所见,错误是由超时引起的还是因为函数不可用引起的。循环有效,结果保持不变 您有机会查看我的最新答案吗?如果满足您的需求,请将其标记为已接受,否则请发表评论 对不起,我迟到了。但它没有用。在我的情况下,外循环超时不起作用,solnl 卡在中间。 :(

以上是关于R 无法尝试捕获多个错误的主要内容,如果未能解决你的问题,请参考以下文章

错误:变量“无法隐式捕获,因为未指定默认捕获模式”

未捕获的类型错误:尝试使用 React MuiAlert 时无法读取未定义的属性“主”

未捕获的安全错误:无法在“历史记录”上执行“replaceState”:无法在原始“null”的文档中创建

未捕获的类型错误:无法读取未定义的属性“toLowerCase”

数据表:未捕获的类型错误:无法读取未定义的属性“长度”

SSIS onTaskfailed/OnErrorfailed 事件,无法捕获最近的错误