首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >错误时再次执行循环

错误时再次执行循环
EN

Stack Overflow用户
提问于 2016-07-28 07:45:47
回答 3查看 1.9K关注 0票数 3

我试着把所有的东西都读了,但是我被一个问题困住了。通过使用bigrquery,我创建了对Google BigQuery的查询来获取数据--不幸的是,有时我的查询由于超时而无法工作。Q是一个SQL-查询,BQ用来存储从BigQuery下载的数据。

有人知道如何在每次tryCatch给我错误时重做循环吗?

到目前为止我已经知道了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BQ_Foo <- NULL
tryCatch(
{ 
repeat{
  BQ_Foo <- query_exec(Q_foo,"bigquery")
  if(is.list(BQ_Foo) == TRUE)break }
}
,error=function(e){cat("ERROR : Query not loaded!", "\n")}
)

编辑:

我再次尝试了我的第一种方法,这一次我收到了以下错误消息:

Curl::curl_fetch_memory中的错误(url,句柄=句柄): 操作被应用程序回调中止。

有人知道怎么处理这件事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-29 04:16:09

广泛地基于r2evans的答案,下面是如何用withRestarts做同样的事情,并得到这篇博客文章的一些帮助

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set.seed(2)
foo <- NULL
operation <- function(x,tries) {
  message(paste("x is",x,"remaining tries",tries))
  withRestarts(
    tryCatch({
      if (runif(1) < x) stop("fail!") else 1
    },
    error=function(e) { invokeRestart("retry")}),
    retry = function() { 
      message("Retrying")
      stopifnot(tries > 0)
      operation(x,tries-1)
    }
  )
}
> operation(0.9,5)
# x is 0.9 remaining tries 5
# Retrying
# x is 0.9 remaining tries 4
# Retrying
# x is 0.9 remaining tries 3
# Retrying
# x is 0.9 remaining tries 2
# Retrying
# x is 0.9 remaining tries 1
[1] 1

这是一种递归调用,所以在再次调用函数之前,您可以做任何您想做的事情。

您可以用同样的方式在tryCatch错误处理程序中这样做,使用重新启动处理程序的兴趣是调用特定的函数,如果您有两个tryCatch,您想要的处理程序行为几乎相同,那么您可以添加一个参数,并在每次尝试捕获时使用相同的处理程序,即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
testfun <- function(x) {
  withRestarts({
    tryCatch(
      {
        ifelse(runif(1) < 0.5,stop("Error Message"),warning("Warning message"))
      },
      warning=function(e) { invokeRestart("logger", level="warning", message=e ) },
      error=function(e) { invokeRestart("logger", level="error", message=e ) } 
    )
    },
    logger = function(level,message) {
      message(date()," [",level,"]: ",message[['message']])
    }
  )
}

给予:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> set.seed(2)
> testfun()
Fri Jul 29 14:15:11 2016 [error]: Error Message
> testfun()
Fri Jul 29 14:15:12 2016 [warning]: Warning message
> testfun()
Fri Jul 29 14:15:13 2016 [warning]: Warning message
> testfun()
Fri Jul 29 14:15:13 2016 [error]: Error Message

这里主要关注的是记录器方法的分解和减少代码重复。

票数 9
EN

Stack Overflow用户

发布于 2016-07-28 08:13:55

天真解决方案

首先,您可能会稍微天真地尝试将重复/在tryCatch之外放置,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set.seed(2)
foo <- NULL
while (is.null(foo)) {
  foo <- tryCatch({
    if (runif(1) < 0.9) stop("fail!") else 1
  },
  error = function(e) { message("err"); NULL; }
  )
}
# err
# err
# err
# err
message("success: ", foo)
# success: 1

不幸的是,您引入了循环永远不会返回的可能性。为了防止这种情况,你可以试试柜台.

较少的钠溶液

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set.seed(2)
foo <- NULL
max_attempts <- 3
counter <- 0
while (is.null(foo) && counter < max_attempts) {
  counter <- counter + 1
  foo <- tryCatch({
    if (runif(1) < 0.9) stop("fail!") else 1
  },
  error = function(e) { message("err"); NULL; }
  )
}
# err
# err
# err
if (is.null(foo)) message("final failure") else message("success: ", foo)
# final failure

现在,这对您更好,但它仍然可能无意中引入拒绝服务“攻击”在服务器上。(请考虑“为什么”查询失败:如果是因为服务器暂时被淹没,那么即使是对一些有限的请求,也会使情况变得更糟。)虽然它会稍微减慢您的速度,但是对于繁忙的服务器来说,暂停会减轻服务器的负担,并且可能给您更好的机会在失败之前获得成功的查询。

更好的解决方案

在网络术语中,小的TCP数据包在重复尝试时会导致拥塞(请参阅纳格尔算法以获得快速参考)。使用某种形式的指数退避是很常见的,为了防止两个(或更多)客户机同时做完全相同的退避,一些客户机稍微抖动(例如,httr::RETRY)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set.seed(2)
foo <- NULL
max_attempts <- 3
# borrowed from hadley/httr::RETRY
pause_cap <- pause_base <- 1
counter <- 0
while (is.null(foo) && counter < max_attempts) {
  if (counter > 0L) {
    length <- stats::runif(1, max = min(pause_cap, pause_base * (2 ^ counter)))
    message("sleeping ", round(length, 1))
    Sys.sleep(length)
  }
  counter <- counter + 1
  foo <- tryCatch({
    if (runif(1) < 0.9) stop("fail!") else 1
  },
  error = function(e) { message("err"); NULL; }
  )
}
# err
# sleeping 0.7
# err
# sleeping 0.2
if (is.null(foo)) message("final failure") else message("success: ", foo)
# success: 1

结业

有些草率的代码,但我希望你明白重点。在没有某种自我限制的情况下在网络查询上设置循环,很容易升级为无意中的DOS。

票数 4
EN

Stack Overflow用户

发布于 2016-07-29 04:46:18

基于您的想法,我创建了这段代码,这似乎是可行的-我只需要强调它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QFoo <- paste0('SQL Code', dateBQ, ' ')
BQFoo <- NULL
testfun <- function(QFoo) {
    withRestarts({
        tryCatch({
            query_exec(QFoo, "bigquery")
        },
        warning = function(e) { invokeRestart("logger", level="warning", message = e) },
        error = function(e) { invokeRestart("logger", level="error", message = e) })
    },
    logger = function(level, message) {
        message(date(), " [", level, "]: ", message[['message']])
    })
}
testfun(QFoo)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38641083

复制
相关文章
JAVA中写时复制Copy-On-Write
写时复制是指:在并发访问的情景下,当需要修改JAVA中Containers的元素时,不直接修改该容器,而是先复制一份副本,在副本上进行修改。修改完成之后,将指向原来容器的引用指向新的容器(副本容器)。
BUG弄潮儿
2020/11/03
5700
​Redis:在集合中复制键
问题描述: 由于某种原因,我必须需要将某个集合的键(Key)复制一份副本。并移动到目标库
PayneWu
2021/06/10
1.9K0
​Redis:在集合中复制键
在Ubuntu_meta 16.04中设置默认Python3.5的命令
ubuntu_meta 默认是安装了python2.7 和python3.5两个版本
墨文
2020/02/28
1.2K0
在Ubuntu_meta 16.04中设置默认Python3.5的命令
Word VBA技术:复制带有自动编号的文本并在粘贴时保留编号的数字
在Word文档中,复制文本并在某处粘贴是经常要进行的操作。然而,如果文档中包含有自动编号的文本内容,例如以自动编号的数字开头的文本,如果要复制的内容不包括第一个编号项,那么这种复制粘贴操作可能会导致问题。在这种情况下,原始文档中的数字和粘贴的文本将不匹配。
fanjy
2023/02/24
2.3K0
使用 yum update 在CentOS下更新时保留特定版本的软件
有时需要保留特定版本的软件不升级,但升级其他软件,这时就需求用到下面的技巧。当CentOS/RHEL/Fedora下的Linux服务器使用 yum update 时命令如何排除选定的包呢?
用户1685462
2021/08/31
2.5K0
windows环境中python3.5下
最近由于一些需求,要搞一下python,于是周末搞了搞.要连接服务器,进行一些服务器的操作,于是安装这个Paramiko包,
py3study
2020/01/13
5240
安装Python3.5
(这样做的目的是在系统任意目录下敲入python调用的都是python3.5的命令,而非系统默认的2.6.6。但是这样会导致依赖python2.6的yum不能使用因此还要修改yum配置)
py3study
2020/01/10
6970
[PHP] PHP5中的写时复制change on write
但是当新的变量值变更时 , 值从新赋予新的值时 , 就会减掉刚才的引用计数,并且从新创建内存空间.
唯一Chat
2020/03/19
7500
phpCOW机制(写时复制)
写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改。 COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C++的STL等。 在PHP内核中,COW也是主要的内存优化手段。 在前面关于变量和内存的讨论中,引用计数对变量的销毁与回收中起着至关重要的标识作用。 引用计数存在的意义,就是为了使得COW可以正常运作,从而实现对内存的优化使用。
仙士可
2019/12/19
6520
phpCOW机制(写时复制)
写时复制集合 —— CopyOnWriteArrayList
" JUC 下面还有一个系列的类,都是 CopyOnWriteXXX ,意思是写时复制,这个究竟是怎么回事?那就以 CopyOnWriteArrayList 为切入点,一起了解写时复制是怎么回事? "
程序员小航
2020/11/23
6280
写时复制集合 —— CopyOnWriteArrayList
C#中的深复制和浅复制(在C#中克隆对象)
C# 支持两种类型:“值类型”和“引用类型”。  值类型(Value Type)(如 char、int 和 float)、枚举类型和结构类型。  引用类型(Reference Type) 包括类 (Class) 类型、接口类型、委托类型和数组类型。
立羽
2023/08/24
8160
用MongoDB Change Streams 在BigQuery中复制数据
Chang Stream(变更记录流) 是指collection(数据库集合)的变更事件流,应用程序通过db.collection.watch()这样的命令可以获得被监听对象的实时变更。BigQuery是Google推出的一项Web服务,该服务让开发者可以使用Google的架构来运行SQL语句对超级大的数据库进行操作。
MongoDB中文社区
2019/08/26
4.1K0
用MongoDB Change Streams 在BigQuery中复制数据
在vim中快速复制粘贴多行
用vim写代码时,经常遇到这样的场景,复制多行,然后粘贴。 我现在这样做: 1. 将光标移动到要复制的文本开始的地方,按V(是大写V)进入可视模式。 2. 将光标移动到要复制的文本的结束的地方,按y复制。此时vim会自动将光标定位到选中文本的开始的地方,并退出可视模式。 3. 移动光标到要粘贴的位置,按p粘贴。
joshua317
2018/04/16
5.2K0
php7 写时复制
在《php7引用计数》的文章中,我们知道,对于复制类型的变量,在赋值时,我们并没有重新复制一份数据,而是让新变量的zend_value中相应的指针指向原来的数据,同时增加引用计数。
跑马溜溜的球
2020/12/07
3.5K0
php7 写时复制
写时复制技术(详解版)
我们知道了一个进程如何采用请求调页,仅调入包括第一条指令的页面,从而能够很 快开始执行。然而,通过系统调用 fork() 的进程创建最初可以通过使用类似于页面共享的技术,绕过请求调页的需要。这种技术提供了快速的进程创建,并最小化必须分配给新创建进程的新页面的数量。
用户5546570
2020/02/13
1.7K1
写时复制技术详解(COW)
写时复制(Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。
小梁编程汇
2021/12/08
5.3K0
Linux 写时复制机制原理
在 Linux 系统中,调用 fork 系统调用创建子进程时,并不会把父进程所有占用的内存页复制一份,而是与父进程共用相同的内存页,而当子进程或者父进程对内存页进行修改时才会进行复制 —— 这就是著名的 写时复制 机制。
用户7686797
2021/04/08
2K0
Python3.5修炼手册3
语句是Python解释器可以运行的一个单元代码,也是理解为可以执行的命令。比如:rint打印语句和赋值语句。
py3study
2020/01/06
5070
Python3.5 图像处理 Pillo
PIL的官方版本,但是最后一次维护是2009年,现以宣布停止维护,可以运行在python2.7上。
py3study
2020/01/10
4660
【Python篇】---Python3.5在Centoos的安装教程--超实用
Python3在公司用的还是比较多的,但一般Centoos默认是python2的环境。所以本文就python3的安装做个总结。
LhWorld哥陪你聊算法
2018/09/13
5880
【Python篇】---Python3.5在Centoos的安装教程--超实用

相似问题

CakePHP 3图像下载损坏

37

PHP下载的图像已损坏

12

Python请求:下载的图像已损坏

22

Windows Phone下载图像-已损坏

12

为什么下载的文件会被破坏?

10
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文