Skip to content

Commit 22cffc5

Browse files
committed
excepter
1 parent efabed5 commit 22cffc5

2 files changed

Lines changed: 126 additions & 0 deletions

File tree

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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+
```

src/excepter.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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()

0 commit comments

Comments
 (0)