文章目录
第十一章:python之异常处理
一、什么是异常
异常: 程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行也会随之终止,如下例子:
print('start run...')
(1,2,3,4,5)(99)
print('stop run...')
# TypeError: 'tuple' object is not callable
二、为何要做异常处理
# 为了增强程序的健壮性,即便是程序运行过程中出错了,也不要终止程序
# 而是捕捉异常并处理:将出错信息记录到日志内
三、异常的三个组成部分
# 异常的追踪信息
# 异常的类型
# 异常的内容
常见的错误类型
# 4.1 语法错误:SyntaxError
# 应该在程序运行前就改正
# if 1>3
# print("run...")
# 4.2 逻辑错误
# number01
age=input(">>: ").strip()
if age.isdigit():
age=int(age)
print(age > 10)
# number02
print(x)
# NameError: name 'x' is not defined
# number03
l=['a','b']
l[2]
# IndexError: list index out of range
# number04
class Foo:
pass
Foo.y
# AttributeError: type object 'Foo' has no attribute 'y'
针对逻辑上的异常又分成两种处理方式
1.错误发生的条件是可以预知的,使用if判断来解决
age=input('>>: ').strip() # 输入的只要不是数字就会出错
if age.isdigit():
age=int(age)
if age > 18:
print('猜大了')
elif age < 18:
print('猜大了')
else:
print('猜对了')
else:
print('必须输入数字')
2.错误发生的条件是无法预知的
print('start...')
try:
# 有可能会抛出异常的代码
dic={
'name':'wuchangwne'}
dic['age']
# 子代码1
# 子代码2
# 子代码3
except IndexError as e:
print('异常的信息: ', e)
except NameError as e:
print('异常的信息: ', e)
else:
print('如果被检测的子代码块没有异常发生,则会执行else的子代码')
finally:
print('无论被检测的子代码块有无异常发生,都会执行finally的子代码')
print('end...')
四、如何异常处理
异常处理的语法
'''
try:
代码1
代码2
代码3
except 异常类型1 as e:
处理异常的代码1
except 异常类型2 as e:
处理异常的代码2
except (异常类型3,异常类型4,异常类型5) as e:
处理异常的代码3
except Exception as e:
处理异常的代码4
else:
被监测的代码块没有发生异常时执行的代码
finally:
无论被监测的代码块有无异常都会执行该代码
print('===>other code<====')
'''
# try不能单独和else连用,如果要用else,必须配合except
"""
try:
print(111)
print(222)
print(3333)
except Exception:
pass
else:
print('ok')
print('===>other code<====')
"""
print('start...')
try:
print('1111111111')
print('2222222222')
print('33333333')
x
except Exception as e: # 万能异常
print('所有异常都可以匹配的到')
else:
print('没有异常====>')
print('end....')
# 获取多个异常
try:
print('start...')
l=[]
l[100]
print('end...')
except KeyError as e:
print("Key错误:",e)
except IndexError as e:
print("索引错误:",e)
except Exception:
pass
print('===>other code<====')
# finally可以单独与try配合使用
try:
执行sql1
执行sql2
执行sql3
执行sql4
执行sql5
except Exception:
执行回滚操作
else:
执行提交操作
print('===>other code<====')
# try:
# print(1111)
# sadf
# print(2222)
# print(33333)
# finally:
# print('====>finally')
# # 回收资源
断言
'''
# 上半部分
print(111)
print(222)
print(333)
names=['egon','jack',]
# if len(names) != 3:
# raise Exception("数据错误")
assert len(names) == 3
# 下半部分
print(names[2])
'''
raise主动抛出异常
class NameType(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return "<%s>" %self.msg
class People:
def __init__(self,name):
self.__name=name
@property
def name(self):
return self.__name
@name.setter
def name(self,v):
if not isinstance(v,str):
raise NameType("名字必须是str类型")
self.__name=v
@name.deleter
def name(self):
del self.__name
obj=People('egon')
obj.name=123123
class Animal:
def speak(self):
raise Exception("必须定义speak方法")
def run(self):
raise Exception("必须定义run方法")
class Dog(Animal):
pass
class People(Animal):
pass
obj1=Dog()
obj2=People()
obj1.speak()
# obj1.run()
作者:吴常文
出处:https://blog.csdn.net/qq_41405475
本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。