【问题标题】:R cannot trycatch multiple errorsR 无法尝试捕获多个错误
【发布时间】: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 循环都应该继续。

【问题讨论】:

    标签: r exception error-handling timeout try-catch


    【解决方案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 卡在中间。 :(
    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多