- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python中异常重试的解决方案详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
大家在做数据抓取的时候,经常遇到由于网络问题导致的程序保存,先前只是记录了错误内容,并对错误内容进行后期处理.
原先的流程:
1
2
3
4
5
6
7
8
9
10
11
|
def
crawl_page(url):
pass
def
log_error(url):
pass
url
=
""
try
:
crawl_page(url)
except
:
log_error(url)
|
改进后的流程:
1
2
3
4
5
6
7
8
9
10
|
attempts
=
0
success
=
False
while
attempts <
3
and
not
success:
try
:
crawl_page(url)
success
=
True
except
:
attempts
+
=
1
if
attempts
=
=
3
:
break
|
最近发现的新的解决方案:retrying 。
retrying是一个 Python的重试包,可以用来自动重试一些可能运行失败的程序段。retrying提供一个装饰器函数retry,被装饰的函数就会在运行失败的条件下重新执行,默认只要一直报错就会不断重试.
1
2
3
4
5
6
7
8
9
10
11
|
import
random
from
retrying
import
retry
@retry
def
do_something_unreliable():
if
random.randint(
0
,
10
) >
1
:
raise
IOError(
"Broken sauce, everything is hosed!!!111one"
)
else
:
return
"Awesome sauce!"
print
do_something_unreliable()
|
如果我们运行have_a_try函数,那么直到random.randint返回5,它才会执行结束,否则会一直重新执行.
retry还可以接受一些参数,这个从源码中Retrying类的初始化函数可以看到可选的参数:
stop_max_attempt_number
:用来设定最大的尝试次数,超过该次数就停止重试stop_max_delay
:比如设置成10000,那么从被装饰的函数开始执行的时间点开始,到函数成功运行结束或者失败报错中止的时间点,只要这段时间超过10秒,函数就不会再执行了wait_fixed
:设置在两次retrying
之间的停留时间wait_random_min和wait_random_max
:用随机的方式产生两次retrying
之间的停留时间wait_exponential_multiplier和wait_exponential_max
:以指数的形式产生两次retrying
之间的停留时间,产生的值为2^previous_attempt_number * wait_exponential_multiplier
,previous_attempt_number
是前面已经retry
的次数,如果产生的这个值超过了wait_exponential_max
的大小,那么之后两个retrying之间的停留值都为wait_exponential_max
。这个设计迎合了exponential backoff
算法,可以减轻阻塞的情况。retry_on_exception
传入一个函数对象:
1
2
3
4
5
6
7
|
def
retry_if_io_error(exception):
return
isinstance
(exception, IOError)
@retry
(retry_on_exception
=
retry_if_io_error)
def
read_a_file():
with
open
(
"file"
,
"r"
) as f:
return
f.read()
|
在执行read_a_file函数的过程中,如果报出异常,那么这个异常会以形参exception传入retry_if_io_error函数中,如果exception是IOError那么就进行retry,如果不是就停止运行并抛出异常.
我们还可以指定要在得到哪些结果的时候去retry,这个要用retry_on_result传入一个函数对象:
1
2
3
4
5
6
|
def
retry_if_result_none(result):
return
result
is
None
@retry
(retry_on_result
=
retry_if_result_none)
def
get_result():
return
None
|
在执行get_result成功后,会将函数的返回值通过形参result的形式传入retry_if_result_none函数中,如果返回值是None那么就进行retry,否则就结束并返回函数值.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:https://www.biaodianfu.com/python-error-retry.html 。
最后此篇关于Python中异常重试的解决方案详解的文章就讲到这里了,如果你想了解更多关于Python中异常重试的解决方案详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
是否可以重试网络客户端请求?在奇怪的情况下,我的应用程序在尝试连接到 xml Web 服务时会抛出错误,但如果我重试,它就可以正常工作。我希望它在抛出错误之前重试 2 次,除非有人有更好的解决方案:)
我在一本书中找到了这段代码片段: int ival; // read cin and test only for EOF; loop is executed even if there are oth
是否可以使用 for lop 来设置对象的条件。如果该条件未通过测试(if 语句),则更改条件直到它通过测试?这是我的伪代码尝试,但我怀疑它是否有效: for (int i = 0; i < myAr
我有以下问题。我的主要 Activity 由一个 ListView 组成,其中填充了从 Web 服务获得的数据。首次加载主要 Activity 时,以防无法从网络检索数据,我想显示一个带有 2 个按钮
我有微服务应用程序。为了协作,每个服务都使用异步消息传递。我知道,spring data jpa 默认使用乐观锁。但是如果这种锁定不是由用户调用,而是由另一个服务调用的方法(在我的示例中有验证服务,可
我希望能够在 F# 中编写一个计算表达式,如果它抛出异常,它将能够重试操作。现在我的代码看起来像: let x = retry (fun() -> GetResourceX()) let y = re
是否可以在 NServiceBus 版本 3.2.2 中禁用重试? 使用以下配置,可以禁用重试: 但当线程数设置为 20 时则不会。在这种情况下,消息会重试两次: 这看起来很像
我在 failed_jobs 上有多个失败的作业。我尝试重新排队 MaxAttemptsExceededException 但总是失败。如何重试那里的工作类型? 注意:每次我通过 php artisa
下面的 sproc 尝试向表中插入一行并生成一个随机 ID,用于在相应表上进行 PK。与随机生成的 ID 的冲突在 catch 块中处理,在那里再次重试/调用该过程。现在,这需要很长时间并导致死锁,因
我试图实现代码以使用“mocha-retry”重试失败的测试以下是示例。 describe(retries,' retries-',function () { var self = this;
我正在尝试通过 Azure 数据工厂将数据从 Azure 数据湖存储插入到 Azure 表。 Azure Data Lake 文件中的数据与最终 Azure 表接收器的架构相同。 ADF 管道包含从
是http.RoundTripper在 Go 中基于 HTTP 状态代码(例如 429)实现 http GET 请求重试机制的正确位置? 它在某种程度上“感觉正确”( Go Playground )并
使用 spring reactive WebClient,我使用了一个 API,如果响应状态为 500,我需要使用指数退避重试。但是在 Mono 类中,我没有看到任何以 Predicate 作为输入参
我一直在尝试编写 react native 的快速入门指南,但一直收到此错误 There appears to be trouble with your network connection. Ret
我正在尝试使用从我们心爱的堆栈溢出中获取的 Retry Monad: type RetryBuilder(max, sleep : TimeSpan) = member x.Return(
使用 spring reactive WebClient,我使用了一个 API,如果响应状态为 500,我需要使用指数退避重试。但是在 Mono 类中,我没有看到任何以 Predicate 作为输入参
我有一个由 C#.NET 4.0 开发的两层 Windows 窗体应用程序。在这个应用程序中,我读取文件内容并在数据访问层中创建实体列表,并将其返回到 GUI 层以在 GridView 中显示。在我当
如果有人问过这个问题,我深表歉意,但我已经做了很多搜索,但还没有找到与我的问题类似的问题。 在我的应用程序中,我有一个密码更改页面,如果某人是新用户或重置了他/她的密码,该页面就会触发。 问题是,一旦
想知道为什么我的 promise 正在解决但试图重试。 var getResultsStream = url => Rx.Observable.onErrorResumeNext( Rx.O
假设我有以下 Promise 链: var result = Promise.resolve(filename) .then(unpackDataFromFile) .then(tra
我是一名优秀的程序员,十分优秀!