异常是指程序运行时引发的错误, 引发错误的方式有很多,例如,除0、下标越界、文件不存在、网络异常、类型错误等等。 出现错误将会导致程序终止 。如果能合理的使用异常处理结构,对程序可能出现的异常进行处理,将python晦涩难懂的错误提示转化为对用户更加友好、更加清晰明了的提示,就能使得程序更加健壮,具有更强的容错性 。
python 异常类
python 中所有的异常基类 是baseException, 其他的所有的异常类都是从这继承的子类。
主要的异常类如下:
baseException | 所有异常基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
Exception | 常规错误 |
Warning | 警告基类 |
python 异常处理结构
try except
异常处理结构最常见的也是最基本的是try except 结构,try 之后的代码块是可能出现异常的语句, except 子句用来捕捉相应的异常。
如果没有捕捉到异常, 则继续往下执行; 如果出现异常被except 捕获, 则执行except 块; 如果出现异常没有被捕获,则向外层抛出。
结构如下:
try:
try 块
except Exception[as reason]:
except 块
例如以下要求用户输入整数的的程序:
while 1 :
try :
x = int(input('please input a number'))
break
except ValueError:
print('this is not a valid number.Try again')
# 运行
please input a number: 'a'
this is not a valid number.Try again
please input a number: 1.5
this is not a valid number.Try again
please input a number: 1
try except else
另一种常用的异常处理结构是try except else , 和上一个结构的区别在于: 如果try 语句没有触发异常, 则执行else 语句块, 若抛出异常则不执行。
while 1 :
try :
x = int(input('please input a integer:'))
except ValueError:
print('this is not a valid number.Try again')
else:
print('You\'ve successfully entered an integer')
break
# 运行
please input a integer: 1
You've successfully entered an integer
try 结构带有多个except
同一段代码可能会抛出多个异常, 需要针对不同的异常做相应的处理, 多个except 块就支持多个异常捕捉处理, 多分支结构,一旦某个except捕获了异常,则后面剩余的except将不再执行。 (如果可能出现多个异常,而不要分别处理,可以将异常写在一个元组中)
while 1 :
try:
x = input('请输入被除数:')
y = input('请输入除数:')
z = float(x)/float(y)
except ZeroDivisionError:
print('除数不能为0')
except ValueError:
print('被除数和除数应为数值类型')
else :
print(x,'/',y,'=',z)
break
# 运行
请输入被除数:a
请输入除数:b
被除数和除数应为数值类型
请输入被除数:1
请输入除数:2
1 / 2 = 0.5
try except finally
另一种重要的异常处理结构是 try except finally , finally 子句中的语句块无论是否发生异常都会执行,常用来做一些清理工作。
try :
f = open('test.txt', 'r')
line = f.readline()
print(line)
finally:
f.close()
无论读取是否发生异常,一定能确保关闭该文件。
断言
断言语句的语法是 assert expression [, reason] 。 当判断表达式expression为真时,什么都不做, 如果为假,则抛出异常。
断言常常用来抛出自定义的异常, 然后和try except语句一起使用 ;
try:
x = float(input('请输入一个正数 :'))
assert x>0
except AssertionError :
print('这不是正数')
# 运行
请输入一个正数 : -1
这不是正数
以上就是python 异常类和异常处理结构了 。
参考文献:
1 董付国 ,Python程序设计 ,清华大学出版社
2 菜鸟笔记, python异常处理结构