websocket 如何在R中永远重试任何类型的失败函数?

lp0sw83n  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(137)

我正在使用R和网页之间的套接字连接。代码运行良好,但在随机时间,它会因为许多可能的原因之一而停止。例如,最常见的R关闭套接字时会发出警告,如:
“handle_read_frame错误:websocketpp. transfer:7(End of File)”“未处理的promise错误:无效状态”
但是停止的其它原因可以包括服务器停止通信、服务器请求确认等。
解决方案是重新启动连接。
我已经把所有这些功能都放在一个函数中,并希望使用trycatch函数创建一个无限循环,并在失败时再次尝试该函数。不幸的是,这并不起作用,因为有时连接只是停止了警告,而不是错误。
我相信下面的代码抓住了问题的本质:

Connect<- function() {X= runif(1); if (X < .5 ) stop(); Sys.sleep(1); return(X) } #stopping function
p=1
while (p==1){
tryCatch({Connect()}, error=function(e) {Connect()})
}

人们期望这段代码总是不停地打印一个随机数。问题是如何实现一个无限循环,在每次失败时,无论出于何种原因,都重新运行一个可能失败的函数?

2uluyalo

2uluyalo1#

不要在错误处理程序中再次调用停止函数,而是将其删除(可选地打印错误消息),否则失败时,它将再次运行停止函数,而不会尝试捕获更多错误。你也可以用类似的方式来警告:

Connect <-
  function() {
    Sys.sleep(0.1)
    X = runif(1)
    if (X < .5) stop("Oops too low!")
    if (X > 0.9) warning("This is a high X!")
    cat(X, "\n")
  } 

while (TRUE) {
  tryCatch({
    Connect()
  }, error = function(e) {
    cat("Error:", e$message, "\n")
  }, warning = function(w) {
    cat("Warning:", w$message, "\n")
  })
}
#> 0.8085583 
#> Error: Oops too low! 
#> Error: Oops too low! 
#> 0.6671211 
#> 0.7245536 
#> Error: Oops too low! 
#> Warning: This is a high X! 
#> 0.7840508 
...

while循环的另一种方法是创建一个安全调用函数,其中包含tryCatch语句,并在完成tryCatch语句时递归调用该函数:

safe_loop <- function() {
  tryCatch(
    Connect(),
    error = function(e) {
      cat("Error:", e$message, "\n")
    }, warning = function(w) {
      cat("Warning:", w$message, "\n")
    }
  )
  safe_loop()
}

safe_loop()
#> 0.6366205 
#> Warning: This is a high X! 
#> 0.5966964 
#> Error: Oops too low! 
#> 0.8586928 
#> Error: Oops too low! 
...

旁注-不要在finally语句中尝试递归调用

今天我学到了这个崩溃的R:

unquittable_recursion <- function() {
  tryCatch(Sys.sleep(1),
           finally = unquittable_recursion()
  )
}

unquittable_recursion()

更新-失败时重复

set.seed(100)

Connect <-
  function() {
    Sys.sleep(0.1)
    X = runif(1)
    if (X < .5) stop("Oops too low!")
    if (X > 0.9) warning("This is a high X!")
    cat(X, "\n")
  } 

safe_loop <- function() {
  tryCatch({
    failed <- TRUE
    Connect()
    failed <- FALSE
  },
  error = function(e) {
    cat("Error:", e$message, "\n")
  }, warning = function(w) {
    cat("Warning:", w$message, "\n")
  })
  if(failed) safe_loop()
}

safe_loop()
#> Error: Oops too low! 
#> Error: Oops too low! 
#> 0.5523224

相关问题