异常及异常处理
异常机制的本质_调试核心理念
所谓异常处理,就是指程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行。
python中引进了很多用来描述和处理异常的类,成为异常类。BaseException是所有异常的父类。
python中一切都是对象,异常也采用对象的方式来处理,处理过程:
- 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象停止当前执行路径,并把异常对象提交给解释器。
- 捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常。
try…except基本结构
try…except是最常见的异常处理结构,结构如下:
try:
被监控的可能引发异常的语句块
except BaseException as e:
异常处理语句块
try块包含着可能引发异常的代码,except块则用来捕捉和处理发生的异常。执行的时候,如果try块中没有引发异常,则跳过except块继续执行后续代码;执行的时候,如果try块中发生了异常,则跳过try块中的后续代码,跳到相应的except块中处理异常;异常处理完后,继续执行后续代码。
遇到异常的处理顺序
【操作】测试简单的0不能作除数异常
print('step0')
try:
print('step1')
a=3/0 #出现异常
print('step2') #被跳过
except BaseException as e:
print('step3')
print('e')
print('step4')
【操作】无异常时
print('step0')
try:
print('step1')
a=3/2 #未出现异常
print('step2') #依然执行
except BaseException as e: #不进入except
print('step3')
print(e)
print('step4')
示例:循环输入数字,如果不是数字则处理异常,直到输入88,则结束循环。
While Ture:
try:
x=int(input('请输入一个数字:'))
print('输入的数字:',x)
if x==88:
print('退出程序')
break
except BaseException as e:
print('e')
print('异常,输入的不是一个数字')
print('循环数字输入结束')
try…多个except结构
当出现多个异常时,按照先子类后父类的顺序,并且针对性的写出异常处理代码,为了避免遗漏可能出现的异常,可以在最后增加BaseException,结构如下:
try:
被监控的,可能出现异常的语句块
except Exception1:
处理Exception1的语句块
except Exception2:
处理Exception2的语句块
except Exception3:
处理Exception3的语句块
…
except BaseException:
处理可能遗漏的异常的语句块
【操作】
try:
a=input('请输入一个被除数:')
b=input('请输入一个除数:')
c=float(a)/float(b)
print(c)
except ZeroDivisionError:
print('异常,除数不能为0')
except ValueError:
print('异常,不能将字符串转化成数字')
except NameError:
print('异常,变量不存在')
except BaseException as e:
print(e)
try…except…else结构
try…except…else结构增加了“else”块。如果try块中没有抛出异常,则执行else块。如果try块中抛出异常,则执行except块,不执行else块。
try:
a=input('请输入一个被除数:')
b=input('请输入一个除数:')
c=float(a)/float(b)
except BaseException as e:
print(e)
else:
print('除数的结果是:',c)
try…except…finally结构
try…except…finally结构中,finally块无论是否发生异常都会被执行;通常用来释放try块中申请的资源。
【操作】
try:
a=input('请输入一个被除数:')
b=input('请输入一个除数:')
c=float(a)/float(b)
except BaseException as e:
print(e)
else:
print(c)
finally:
print('我是finally中的语句,无论发生异常与否,都执行!')
print('程序结束')
【操作】
try:
f=open('d:/a.text','r')
content=f.readline()
print(content)
except:
print('文件未找到')
finally:
print('run in finally。关闭资源')
print('程序执行结束')
return语句和异常处理问题
由于return有两种作用:结束方法运行、返回值。一般不把return放在异常处理结构中,而是放到方法最后。
def test01():
print('step1')
try:
x=3/0
#return 'a'
except:
print('step2')
print('异常:0不能作为除数')
#return 'b'
finally:
print('step4')
#return 'd'
print('step5')
return 'e' #一般不要将return语句放到try,except,else,finally块中,会发生一些意想不到的错误,建议放到方法最后。
print(test01())
traceback模块
使用traceback模块打印异常信息
import traceback
try:
print('step1')
num=1/0
except:
traceback.print_exc()