错误与异常
-
错误:程序运行前的语法问题,如:关键字、缩进、括号不成对等
-
异常:在程序运行过程中出现的错误,如:变量未定义、除数为0、属性不存在等
异常处理
-
说明:异常处理可以认为是一种特殊的流程控制语句,可以提高代码的健壮性。
-
语法:try-except
try: print('正常执行') # print(a) print(3/0) except Exception as e: # Exception是所有异常的基类,因此此处可以捕获所有异常 print('出现异常,进行处理') print(e) print('其他代码')
-
捕获多个异常:
try: # print(a) # print(3/0) fp = open('123.txt') except NameError as e: print('NameError:', e) except ZeroDivisionError as e: print('ZeroDivisionError:', e) except Exception as e: print('other:', e)
也可以对多种异常进行分组处理:
try: # print(a) # print(3/0) fp = open('123.txt') except (NameError, ZeroDivisionError) as e: # 将特定的某些异常统一处理,写到元组中即可 print(e) except: print('其他异常')
-
else和finally
try: print('正常执行') print(a) except: print('出现异常') else: # 出现异常就不执行了 print('正常结束') finally: # 无论有误异常都会执行 print('无论如何都执行')
else:在没有异常的时候回执行,出现异常就不执行了
finally:无论是否有异常,都会执行
-
抛出异常:raise
try: print('开始') # 根据代码逻辑的需要,手动抛出特定的异常 raise Exception('手动抛出异常') print('一切正常') except Exception as e: print('出现异常:', e) print('结束')
-
异常嵌套:try-except结构中嵌套try-except结构
print('我要去上班,什么事情都不能阻止我上班的脚步') try: print('我准备骑电动车') raise Exception('昨天晚上那个缺德的家伙把我充电器给拔了,无法骑车') print('骑电动车提前到达公司') except Exception as e: print(e) try: print('我准备坐公交') raise Exception('等了20分钟一直没有公交车,果断放弃') print('坐公交准时到达公司') except Exception as e: print(e) print('我准备打车') print('打车还是快,一会就到公司了') print('热情满满的开始一天的工作')
-
自定义异常类:继承自异常的基类(Exception)
# 自定义异常类,名字通常以Exception结尾 class MyException(Exception): def __init__(self, msg): self.msg = msg def __str__(self): # repr键变量转换成字符串,若本身是字符串则不必要 # return repr(self.msg) return self.msg def deal(self): print('异常已处理') try: print('正常执行') raise MyException('手动抛出定义异常') except MyException as e: print(e) e.deal()
-
特殊使用
-
场景:做文件操作时,中间无论读写,也无论有误异常,最终一定要把文件关闭
-
with:使用with,不必再关系文件的关闭问题,with语句块结束后一定会确保文件关闭
# fp = open('test.txt', 'rb') # # 各种读写操作 # fp.close() # 使用with,无需关心文件的关闭问题 with open('test.txt', 'rb') as fp: content = fp.read(5) print(content)
-