错误与异常
-
错误:程序运行前的语法问题,如:关键字、缩进、括号不成对等
-
异常:在程序运行过程中出现的错误,如:变量未定义、除数为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)
-