Python异常处理
一、了解Python异常处理
在程序中为了增强健壮性,我们需要考虑异常处理方面的内容。比如在读取文件时要考虑文件不存在的情况,在做除法运算时要考虑除0的情况……。我们把这些可能产生的异常在程序中进行对应的处理保证程序不无故异常退出这就是异常处理。
做除法运算时的除0异常处理
二、捕获程序中异常
就如上面的列子,我们不可以防止用户输入0,但是我们可以在产生这种情况后捕获到并处理异常,从而让程序不会因此而直接终止并退出。
try-except语句
通过try-except语句可以实现对异常的捕获,其语法结构如下:
try:
可能产生异常的语句
except [异常类型]:
处理异常
结构说明:
1、try后要有英文半角冒号
2、可能产生异常的语句,处理异常前都要做缩进处理(Python中推进使用4个半角空格)
3、异常类型那个声明是可以省略的
# coding=utf-8
i = input("请输入数字:")
n = 100
try:
result = n / int(i)
print(result)
print("{0}除以{1}等于{2}".format(n,i,result))
except Exception as e:
print("不可以除以0,异常:{}".format(e))
上面except后的Exception也可以替换为ZerDivisionError,因为实际上除0产生的异常类型就是ZerDivisionError。
多个except代码块
多条语句可能会产生多种不同的异常,对于每一种异常都会采用不同的处理方式,对于这个情况可以在try后跟多个except代码块
# coding=utf-8
i = input("请输入数字:")
n = 100
try:
result = n / int(i)
print(result)
print("{0}除以{1}等于{2}".format(n,i,result))
except ZeroDivisionError as e1:
print("产生异常:{}".format(e1))
except ValueError as e2:
print("产生异常:{}".format(e2))
这里分别捕获两个不同的异常:ZeroDivisionError、ValueError
多重异常捕获
像上面一样如果我们要对多种异常做捕获,而多种异常的处理方式又是相同的,则可以在一个except中写入多个指定的异常
# coding=utf-8
i = input("请输入数字:")
n = 100
try:
result = n / int(i)
print(result)
print("{0}除以{1}等于{2}".format(n,i,result))
except (ZeroDivisionError,ValueError) as ex:
print("产生异常:{}".format(ex))
try-except语句嵌套
# coding=utf-8
i = input("请输入数字:")
n = 100
try:
i1 = int(i) # 这里可能产生异常,由外层的try捕获 ValueError
try:
result = n / i1 # 这里可能产生异常,由里层的try捕获 ZeroDivisionError
print("{0}除以{1}等于{2}".format(n,i,result))
except ZeroDivisionError as e1:
print("产生异常:{}".format(e1))
except ValueError as e:
print("产生异常:{}".format(e))
三、finally代码块
有时候在try-except语句中会占用一些资源,如打开文件,网络连接、打开数据库及数据结果集……都会占用计算机资源,这些资源的占用都需要开发人员去释放,为了确保这些资源能被释放掉可以使用finally代码块,因为不管是否发生异常,finally代码块的语句都会执行到。
try-except语句后面可以跟一个finally代码块,其语法如下:
try:
可能发生异常的语句
except 异常类型1:
处理异常
except 异常类型2:
处理异常
……
except:
处理异常
finally:
释放资源
自定义异常类
自定义异常类,需要继承Exception类或其子类,前面我们说的ValueError和ZeroDivisionError都是属于Exception的子类。
# coding=utf-8
class MyException(Exception):
def __init__(self,message):
super().__init__(message)
i = input("请输入数字:")
n = 100
def chu(n,i):
if i > n:
raise MyException("除数大于被除数了!") # 手动触发一个异常 使用 raise
else:
return n / i
try:
result = chu(n,int(i))
print("{0}除以{1}的结果是{2}".format(n,i,result))
except ZeroDivisionError as e:
print("发生异常,{}".format(e))
except ValueError as e1:
print("发生异常,{}".format(e1))
except MyException as e2:
print("发生异常,{}".format(e2))