一、异常
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