1、什么是异常处理
异常是错误发生的信号,一旦程序出错就会产生一个异常
如果该异常没有被处理,该异常就会被抛出来,程序的运行随即终止
错误又分两种:
- 语法错误: 若出现,执行程序不会执行,须要执行前修正;
- 逻辑错误: 程序可以执行,运行中出现才会抛出。
异常信息由三部分组成
- 具体哪一行代码抛出的异常
- 异常的种类
常用异常
AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
- 异常的内容及信息
2、异常的处理
为了增强程序的健壮性(稳定性\容错性),遇到错误不崩溃,我们需对异常进行处理;
针对语法错误: 应该运行前立即改正;
针对逻辑错误:
- 如果逻辑错误发生的条件是可以预知的,应该if判断解决,预防异常;
age = input('>>: ').strip()
if age.isdigit():
age=int(age)
if age > 18:
print('too big')
elif age < 18:
print('too small')
else:
print("got it")
else:
print('必须输入数字')
- 如果逻辑错误发生的条件是不可预知的,那么异常一个会发生,考虑到程序的健壮性我们应该处理异常,做好补救措施,需要用到try…except:在错误发生之后进行处理;
# 基本语法:
try:
代码块
except 异常的类型:
发生异常后要执行的代码
1、 异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
s1 = 'hello'
try:
int(s1)
except IndexError as e: # 未捕获到异常,程序直接报错
print e
2、 多分支
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
try:
print("====>111")
print("====>222")
# xxx
# l=[]
# l[0]
dic={}
dic["k1"]
print("====>333")
except (NameError,IndexError) as e:
print("=---->",e)
except KeyError as e:
print(e)
print('====>4')
3、 finally
# 无论try语句中是否抛出异常,finally中的语句一定会被执行
try:
print("====>111")
print("====>222")
xxx=111
# l=[]
# l[0]
dic={}
# dic["k1"]
print("====>333")
except (NameError,IndexError) as e:
print("=---->",e)
except KeyError as e:
print(e)
finally:
print("一定会运行")
print('====>4')
# print(xxx)
4、 万能异常Exception
s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)
5、主动触发异常
try:
raise TypeError('类型错误')
except Exception as e:
print(e)
6、自定义异常
class Interface(BaseException):
def __init__(self, msg, x, y, z):
self.msg = msg
self.x = x
self.y = y
self.z = z
def __str__(self):
return "<%s:%s:%s:%s>" % (self.msg,self.x,self.y,self.z)
raise Interface("接口异常", 11, 22, 33)
7、断言 assert 条件
print("====1")
print("====2")
print("====3")
salaries=[1.1,2.2,2]
assert len(salaries) == 3 # 符合继续运行,否则抛出异常
print(salaries[2])
print(salaries[2])
print(salaries[2])
8、 总结try..except
1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;