File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+
2+ 写一个装饰器,统计某个异常重复出现指定次数时,经历的时长。
3+ ``` python
4+ import time
5+ import math
6+
7+
8+ def excepter (f ):
9+ i = 0
10+ t1 = time.time()
11+ def wrapper ():
12+ try :
13+ f()
14+ except Exception as e:
15+ nonlocal i
16+ i += 1
17+ print (f ' { e.args[0 ]} : { i} ' )
18+ t2 = time.time()
19+ if i == n:
20+ print (f ' spending time: { round (t2- t1,2 )} ' )
21+ return wrapper
22+
23+ ```
24+
25+ 关键词` nonlocal ` 常用于函数嵌套中,声明变量i为非局部变量;
26+
27+ 如果不声明,` i+=1 ` 表明` i ` 为函数` wrapper ` 内的局部变量,因为在` i+=1 ` 引用(reference)时,` i ` 未被声明,所以会报` unreferenced variable ` 的错误。
28+
29+ 使用创建的装饰函数` excepter ` , ` n ` 是异常出现的次数。
30+
31+ 共测试了两类常见的异常:` 被零除 ` 和` 数组越界 ` 。
32+
33+ ``` python
34+ n = 10 # except count
35+
36+ @excepter
37+ def divide_zero_except ():
38+ time.sleep(0.1 )
39+ j = 1 / (40 - 20 * 2 )
40+
41+ # test zero divived except
42+ for _ in range (n):
43+ divide_zero_except()
44+
45+
46+ @excepter
47+ def outof_range_except ():
48+ a = [1 ,3 ,5 ]
49+ time.sleep(0.1 )
50+ print (a[3 ])
51+ # test out of range except
52+ for _ in range (n):
53+ outof_range_except()
54+
55+ ```
56+
57+ 打印出来的结果如下:
58+ ``` python
59+ division by zero: 1
60+ division by zero: 2
61+ division by zero: 3
62+ division by zero: 4
63+ division by zero: 5
64+ division by zero: 6
65+ division by zero: 7
66+ division by zero: 8
67+ division by zero: 9
68+ division by zero: 10
69+ spending time:1.01
70+ list index out of range : 1
71+ list index out of range : 2
72+ list index out of range : 3
73+ list index out of range : 4
74+ list index out of range : 5
75+ list index out of range : 6
76+ list index out of range : 7
77+ list index out of range : 8
78+ list index out of range : 9
79+ list index out of range : 10
80+ spending time:1.01
81+ ```
Original file line number Diff line number Diff line change 1+ import time
2+ import math
3+
4+
5+ def excepter (f ):
6+ i = 0
7+ t1 = time .time ()
8+
9+ def wrapper ():
10+ try :
11+ f ()
12+ except Exception as e :
13+ nonlocal i
14+ i += 1
15+ print (f'{ e .args [0 ]} : { i } ' )
16+ t2 = time .time ()
17+ if i == n :
18+ print (f'spending time:{ round (t2 - t1 ,2 )} ' )
19+ return wrapper
20+
21+
22+ n = 10 # except count
23+
24+
25+ @excepter
26+ def divide_zero_except ():
27+ time .sleep (0.1 )
28+ j = 1 / (40 - 20 * 2 )
29+
30+
31+ # test zero divived except
32+ for _ in range (n ):
33+ divide_zero_except ()
34+
35+
36+ @excepter
37+ def outof_range_except ():
38+ a = [1 , 3 , 5 ]
39+ time .sleep (0.1 )
40+ print (a [3 ])
41+
42+
43+ # test out of range except
44+ for _ in range (n ):
45+ outof_range_except ()
You can’t perform that action at this time.
0 commit comments