有时候我们要去别的接口取数据,可能因为网络原因偶尔失败,为了能自动重试,写了这么一个装饰器。
这个是python2.7x 的版本,python3.x可以用 nonlocal 来重写。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#-*- coding: utf-8 -*- #all decorators in this tool file #author: orangleliu ############################################################ #http连接有问题时候,自动重连 def conn_try_again(function): RETRIES = 0 #重试的次数 count = { "num" : RETRIES} def wrapped( * args, * * kwargs): try : return function( * args, * * kwargs) except Exception, err: if count[ 'num' ] < 2 : count[ 'num' ] + = 1 return wrapped( * args, * * kwargs) else : raise Exception(err) return wrapped |
用法很的简单,下面是一个程序片段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@conn_try_again def post_query_bandwidth_for_bandwidth( self , contract_no, data_month, product_code): #根据webluker接口情况获取计费数据 try : post_data = { 'contract' :contract_no, 'month' : data_month, 'code' :product_code} params = urllib.urlencode(post_data) response = urllib2.urlopen(WEBLUKER_BANDWITH_API + "?" + params) billdata = {} billdata = response.read() if not billdata: billdata = {} return billdata except Exception, err: err = u '与webluker接口间通信异常' raise Exception(err) |
如果try块中有异常,就会自动重试2次。