一、认识异常:
- 首先语法错误不是异常;
- 在程序运行中没有考虑到或者不可预见的事件导致出现错误;
- 好比:你和家人计划在周末去郊外野炊,周末到达郊外准备野炊时突然下起了倾盆大雨。
- 为增强程序的健壮性,程序的编写需要考虑如何处理这些异常情况;
- Python语言提供了异常处理功能。
- 常见的异常,Python有很多,常见的有这样几个
1.AttributeError 异常:
试图访问一个类中不存在的成员(包括:成员变量、属性和成员方法)而引发的异常。
2.OSError 异常:
是操作系统相关异常。在Python3.3版本后IOError(输入输出异常)也并入到OSError异常;所以输入输出异常也属于OSError异常。例如"未找到文件"或"磁盘已满"异常。
3.IndexError 异常:
是访问序列元素时,下标索引超出取值范围所引发的异常。
4.KeyError 异常:
是试图访问字典里不存在的键时而引发的异常。
5.NameError 异常:
是试图使用一个不存在的变量而引发的异常。
6.TypeError 异常:
是试图传入变量类型与要求的不符合时而引发的异常。
7.ValueError 异常:
是由于传入一个无效的参数值而引发的异常。
二、使用条件选择处理异常
- 我可以用条件选择的方法如 if input.isdigit() ,对异常进行处理,但是在写程序时候,不可能把所有异常的可能都想到;就好比你在野炊之前,观察天气预报或者准备防雨措施,但还有很多不可预见的事件,事物发展有很多的不确定因素~!
三、异常处理的介绍
- 如何程序不进行异常处理,当程序遇到异常的时候,程序会终止运行(强行退出)。
- 异常处理:当出现异常的时候,会告诉用户或者开发者出现了异常,并不影响程序的继续运行。
- 异常处理在代码中主要有两种方法:异常捕获、抛出异常;
异常捕获有四种形式:
1.try—except
2.try—except—else
3.try—except—finally
4.try—except—else—finally
抛出异常:
使用raise关键字来抛出。
四 、获取异常的信息
list01 = [11, 22, 33, 44, 55, 66, 77]
try:
print(list01[10])
except Exception as e:
print("出现异常错误")
print(str(e)) # 反馈异常的基本信息
print(e) # 反馈异常的基本信息
print(e.args[0]) # 反馈异常的基本信息
print(repr(e)) # 反馈异常的类型和异常的基本信息
# 反馈更详细的信息,需要引入 import traceback
print(traceback.format_exc()) # 反馈异常的详细信息
# 写入文件 traceback.print_exc(file=open("文件目录文件名", "w"是写入参数))
traceback.print_exc(file=open("e:\\Exception.ini", "w"))
五、 捕获异常:
1.try—except
- try: 有可能出现异常的代码
- except: 如果出现异常所执行的代码
实现方式一
num01 = int(input("请输入一个整数: "))
num02 = int(input("请输入再一个整数: "))
try:
print("%d / %d = %.2f"%(num01, num02, num01 / num02))
except:
# 方式1.基本方式:只显示提示信息
print("代码出现异常")
# 方式2:客户方式,显示提示信息,将异常信息保存日志文件
print("代码出现异常,请联系管理员")
traceback.print_exc(file=("e:\\error.ini", "w"))
# 方式3,开发者方式,显示异常信息
except Exception as e:
print(str(e)) # 反馈异常的基本信息
print(repr(e)) # 反馈异常的类型和异常的基本信息
print(traceback.format_exc()) # 反馈异常的详细信息
实现方式二
num01 = int(input("请输入一个整数: "))
num02 = int(input("请输入再一个整数: "))
try:
print("%d / %d = %.2f"%(num01, num02, num01 / num02))
except ValueError as e: # 依据具体的异常类
print("输入的不是整数")
except ZeroDivisionError as e: # 依据具体的异常类
print("除数不能为零")
except Exception as e: # 通用类~!
print("未知的异常,具体参看日志文件")
traceback.print_exc(file=("e:\\error.ini", "w"))
- 关于 try–except–else
try: 可能出现异常的代码
except: 如果出现异常执行的代码
else: 如果没有出现异常执行的代码 - 关于 try–except–finally
try: 可能出现异常的代码
except: 如果出现异常执行的代码
finally: 无论是否出现异常都会执行的代码 - 关于 try–except–else–finally
try: 可能出现异常的代码
except: 如果出现异常执行的代码
else: 如果没有出现异常执行的代码
finally: 无论是否出现异常都会执行的代码
无论try中的代码是否有异常,finally中的代码都会被执行!
finally代码主要对资源的回收:打开文件的关闭或者打开数据之后的关闭连接
num01 = int(input("请输入一个整数: "))
num02 = int(input("请输入再一个整数: "))
try:
print("%d / %d = %.2f" % (num01, num02, num01 / num02))
except ValueError as e:
print("输入的不是整数")
except ZeroDivisionError as e:
print("除数不能为零")
except Exception as e:
print("未知的异常,具体参看日志文件")
traceback.print_exc(file=("e:\\error.ini", "w"))
else:
print("这个是else的代码")
finally:
print("这个是finally的代码")
这里要强调 finally 主要用于打开资源的回收
学习案例《读取文件数据》(代码有问题尚待解决)
try:
global fd # global在函数内将变量定义为全局变量,在函数内部使用。
fd = open("d:\\python\\project\\dome\\staff.csv")
print(fd.read())
except FileNotFoundError as e:
print("文件的路径或者名称错误!")
except UnicodeDecodeError as e:
print("编码无法识别!")
except Exception as e:
print("未知的异常,具体参看日志文件")
traceback.print_exc(file=("e:\\error.ini", "w"))
finally:
fd.close()
案例中用到的global是将函数内的变量定义为全局变量。在函数内使用。
六、抛出异常 raise
学习案例:输入两个0-1000之间的整数,求和差积商
def div_number(num01:int, num02:int):
if num01 < 0 or num01 > 1000 or num02 < 0 or num02 > 1000:
raise Exception("输入的值不在范围内")
try:
return num01 / num02
except ZeroDivisionError as e:
raise e
def add_number(num01:int, num02:int):
return num01 + num02
if __name__ == "__main__":
try:
num01 = int(input("输入一个0-1000之间的整数 "))
num02 = int(input("输入一个0-1000之间的整数 "))
print("%d / %d = %d" % (num01, num02, div_number(num01, num02)))
print("%d + %d = %d" % (num01, num02, add_number(num01, num02)))
except ValueError as e:
print("输入的不是数字")
except ZeroDivisionError as e:
print("除数不能是0")
except Exception as e:
print(e)
学海无涯苦作舟,慢慢行来慢慢行