一、异常
while True:
str1='请输入第一个数:'
str2='请输入第二个数:'
print('开始执行除法运算')
op1=int(input(str1))
op2=int(input(str2))
result = op1 /op2
print('%d / %d = %d'%(op1,op2,result))
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
开始执行除法运算
请输入第一个数:1
请输入第二个数:0
Traceback (most recent call last):
File "/Users/liuqian/PycharmProjects/learn/面向对象/异常.py", line 53, in <module>
result = op1 /op2
ZeroDivisionError: division by zero
Process finished with exit code 1
异常与错误
异常:在程序的运行过程中发生的不正常的事件,会中断正在运行的程序。
例如:读取文件时,文件不存在....
访问数据库时,数据库管理系统没有启动...
网络连接中断...
算术运算时,除数为0...
序列越界......
错误(Error)是指程序有缺陷(Bug)
语法错误:python解释器无法解释,在程序执行前纠正
逻辑错误:因为不完整或是不合法的输入导致程序执行得不到预期的结果
异常处理:
对引发的异常进行处理,保证程序能继续执行并获得正确的结果
异常处理的2个阶段:
1.引发异常
2.处理异常
在异常发生时,不仅能检测到异常条件,还可以在异常发生时采取更可靠的补救措施,排除异常
常见的内置异常:NameError ZeroDivisionError SyntaxError IndexError KeyError IOError AttributeError。。。
二、检测和处理异常:
通过try语句检测异常
任何在try语句块里的代码都会被检测,检查是否与异常发生
try语句的两种主要形式:try-except try-finally
try-except:定义异常监控的一段代码,并且提供吃力异常的机制(带有多个except的try语句)
try:
语句 #被监控异常的代码
except 异常类[,对象]:
语句 #异常处理的代码
语句执行顺序:
1.执行try语句块中的语句
2.如果出现异常,立即中断try语句的执行,转到except语句块
3.将异常类型与except语句块中的异常匹配,如果匹配成功,执行相应的异常处理,如果匹配不成功,将异常传递给更高一级的try语句
4.如果异常一直没有找到处理程序则停止执行,抛出异常信息
加异常处理:
while True:
str1='请输入第一个数:'
str2='请输入第二个数:'
print('开始执行除法运算')
try:
op1=int(input(str1))
op2=int(input(str2))
result = op1 /op2
print('%d / %d = %d'%(op1,op2,result))
except ZeroDivisionError:
pass
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
开始执行除法运算
请输入第一个数:1
请输入第二个数:0
开始执行除法运算
请输入第一个数:
while True:
str1='请输入第一个数:'
str2='请输入第二个数:'
print('开始执行除法运算')
try:
op1=int(input(str1))
op2=int(input(str2))
result = op1 /op2
print('%d / %d = %d'%(op1,op2,result))
except ZeroDivisionError as e:
print(e)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
开始执行除法运算
请输入第一个数:1
请输入第二个数:0
division by zero
开始执行除法运算
请输入第一个数:
带有多个except的try语句
def xy_float(obj):
try:
retval = float(obj)
except ValueError as e:
retval = '文字不能转换'
except TypeError as e:
retval = '类型错误'
except Exception as e:
retval ='有异常'
return retval
print(xy_float('sss'))
print(xy_float(''))
print(xy_float(22))
print(xy_float('22.2'))
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
文字不能转换
文字不能转换
22.0
22.2
Process finished with exit code 0
def xy_float(obj):
try:
retval = float(obj)
except (ValueError,TypeError):
retval = '参数必须是一个数值或数值字符串'
except Exception as e:
retval ='有异常'
return retval
print(xy_float('sss'))
print(xy_float(''))
print(xy_float(22))
print(xy_float('22.2'))
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
参数必须是一个数值或数值字符串
参数必须是一个数值或数值字符串
22.0
22.2
Process finished with exit code 0
BaseException类是所有异常值母
Exception类是其他异常子类的父类
如果多个Except语句块同时出现在一个try语句中,异常的子类应该出现在其父类之前(子类在父类之前)
引发多种类型的异常:
1.排列Except语句的顺序:先子类后父类
2.发生异常时按顺序逐个匹配
3.只执行第一个与异常类型匹配的Except语句
else语句块
try:
语句 #被监控异常的代码
except 异常类[,对象]:
语句 #异常处理的代码
else:
语句 #try语句块的代码全部成功时的操作(即没有发生异常)
while True:
str1='请输入第一个数:'
str2='请输入第二个数:'
print('开始执行除法运算')
try:
op1=int(input(str1))
op2=int(input(str2))
result = op1 /op2
except ZeroDivisionError as e:
print('除数不能为零')
else:
print('%d / %d = %d' % (op1, op2, result))
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
开始执行除法运算
请输入第一个数:1
请输入第二个数:0
除数不能为零
开始执行除法运算
请输入第一个数:1
请输入第二个数:1
1 / 1 = 1
开始执行除法运算
请输入第一个数:
finally语句块
无论是否发生异常,都会执行的一段代码
可以与try语句块一起使用
try-except-funally
try-except-else-finally
try-finally
通常用来释放占用的资源,例如:关闭文件,文件数据库的连接
读写文件的操作:
filename='e:/xy.tet'
fp=None
try:
fp = open('e:/xy.tet','r+')
fp.write('duang')
except IOError:
print('文件读写出错')
except Exception:
print('文件操作异常')
else:
fp.seek(2)
f = fp.readlines()
print(f)
finally:
fp.close()
print('关闭文件')
三、抛出异常,自定义异常
抛出异常:
raise语句格式很多,常用格式
raise 异常类
raise 异常类(自定义提示信息)
xyname=input('请输入名字:')
if xyname=='小雨':
raise NameError('不允许输入此姓名!!!')
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
请输入名字:小雨
Traceback (most recent call last):
File "/Users/liuqian/PycharmProjects/learn/面向对象/异常.py", line 90, in <module>
raise NameError('不允许输入此姓名!!!')
NameError: 不允许输入此姓名!!!
Process finished with exit code 1
自定义异常类(调用者解决异常)
def xyname():
xyname = input('请输入名字:')
if xyname == '小雨':
raise NameError('不允许输入此姓名!!!')
return xyname
while True:
try:
xyname=xyname()
print('xyname is %s'%xyname)
break
except NameError:
print('请输入正确的名字')
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/异常.py
请输入名字:小雨
请输入正确的名字
请输入名字:小李
xyname is 小李
Process finished with exit code 0