异常处理与装饰器

一、异常处理

1、万能异常(try except Exception)

把可能发生错误的语句放在try模块里,用except来处理异常。except可以处理一个专门的异常,也可以处理一组圆括号中的异常,如果except后没有指定异常,则默认处理所有的异常。每一个try,都必须至少有一个except。

1
2
3
4
5
s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)

2、主动触发异常

python自己定义的内建异常不够用,用户可以自定义异常。

1
2
3
4
try:
raise UserError("自定义异常")
except FError as e:
print(e)

或者使用Exception将异常信息捕获。

1
2
3
4
try:
func(a)
except Exception as e:
raise Exception(f"错误模块:{name} \n错误信息: {str(e)}")

二、Python装饰器

装饰器是给现有的模块增添新的小功能,可以对原函数进行功能扩展,而且还不需要修改原函数的内容,也不需要修改原函数的调用。装饰器的使用符合了面向对象编程的开放封闭原则。

开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立其工作,而不要对类尽任何修改。

Python之中,万物皆对象,即万物都可传参。那么函数也可以作为函数的参数进行传递的。

1
2
3
4
5
6
7
8
9
10
11
12
13
def polar_bear():
print("我是爱上企鹅的北极熊")

def blog(name):
print('进入blog函数')
name()
print('我的博客是 lepzh.top')

if __name__ == '__main__':
func = polar_bear # 把polar_bear这个函数名赋值给变量func
func() # 执行func函数
print('------------')
blog(polar_bear)

如果想知道,这两个函数分别的执行时间是多少,将代码修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import time
def polar_bear():
t1 = time.time()
print("我是爱上企鹅的北极熊")
print("执行时间为:", time.time() - t1)

def blog(name):
t1 = time.time()
print('进入blog函数')
name()
print('我的博客是 lepzh.top')
print("执行时间为:", time.time() - t1)

if __name__ == '__main__':
func = polar_bear # 把polar_bear这个函数名赋值给变量func
func() # 执行func函数
print('------------')
blog(polar_bear)

如果函数数量众多或者函数内容过于复杂,那么逐个给函数添加time计算代码耗时且耗力,由此引出装饰器的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import time
def runtime1(func):
def wrapper():
t1 = time.time()
func()
t2 = time.time()
print("执行时间为:{:.4} s".format(t2 - t1))
return wrapper

def runtime2(func):
def wrapper(*args, **kwargs):
t1 = time.time()
res = func(*args, **kwargs)
t2 = time.time()
print("执行时间为:{:.4} s".format(t2 - t1))
return res
return wrapper

@runtime1
def polar_bear():
print("我是爱上企鹅的北极熊")

@runtime2
def blog(name):
print('进入blog函数')
name()
print('我的博客是 lepzh.top')
return 100

if __name__ == '__main__':
mine = polar_bear # 把polar_bear这个函数名赋值给变量func
mine() # 执行func函数
print('------------')
blog(polar_bear) # 把polar_bear函数作为参数传入blog函数

在runtime2()中,wrapper函数的参数为*args和**kwargs,表示可以接受任意参数形式。该装饰器普遍适用于函数有参数以及返回值的时候。