一、异常捕获
在python中,通过捕获异常,使得程序可以不会因为出错停止运行,捕捉程序有可能产生的异常,防止程序由于异常 导致的出错闪退,异常有可能有,也可能不发生。
"""
try: 执行有可能出错的代码
except: 捕获到具体的异常,针对处理
else: except中语句不执行,则执行else
finally: 无论有没有异常都执行
"""
input_str = input("请输入一个数字")
input_str2 = input("请输入一个数字")
try:
input_value = int(input_str)
input_value2 = int(input_str2)
print(f"{input_value}除以{input_value2}得{input_value/input_value2}")
print(f"您输入的被除数是{input_value}")
print(f"您输入的除数是{input_value2}")
except Exception as e: # 异常范围太宽泛,不精确
print("输入有误,格式转换错误", e)
else:
print("没有发现异常")
finally:
print("无论有没有异常,都执行")
print("程序正常结束")
try:
with open("123.txt", "r") as f:
print(f.read())
except FileNotFoundError as e: # 具体异常
print("文件不存在")
except Exception as e:
print("未知异常")
通过对异常分类,可以跟直观反映代码的异常。
input_str = input("请输入一个数字")
input_str2 = input("请输入一个数字")
try:
input_value = int(input_str)
input_value2 = int(input_str2)
print(f"{input_value}除以{input_value2}得{input_value/input_value2}")
print(f"您输入的被除数是{input_value}")
print(f"您输入的除数是{input_value2}")
except TypeError as e:
print("类型错误")
except ValueError as e:
print("数值类型错误")
except ZeroDivisionError as e:
print("错误,除数为0")
except Exception as e:
print("输入有误,格式转换错误", e)
else:
print("没有发现异常")
finally:
print("无论有没有异常,都执行")
print("程序正常结束")
try:
with open("123.txt", "r") as f:
print(f.read())
except FileNotFoundError as e:
print("文件不存在")
except Exception as e:
print("未知异常")
二、异常类型
这里只举几个常见异常,欢迎补充
"""
Exception 异常(较宽泛的异常)
TypeError 类型异常
ValueError 数值异常
ZeroDivisionError 除数为0异常
FileNotFoundError 文件不存在异常
OperationalError 操作异常
ConnectionError 连接异常
"""
三、抛出异常
我们可以自己设置一个异常类,在合适的位置使用raise关键抛出异常,进行捕获。
# 斐波那契数列
class LTOne(Exception): # 自定义异常类(小于一),继承异常类
def __init__(self, msg):
super().__init__(msg) # 接收异常原因反馈
while True:
value_str = input("请输入查找的位数")
try:
value = int(value_str)
if value < 1:
raise LTOne("小于1") # 传入异常原因
else:
first = 1
second = 1 # 前两个数是1
current = 0
for i in range(3, value+1): # 后一位是前两个数的和
current = first + second
first = second
second = current
if value == 1 or value == 2:
print(1)
else:
print(current)
except ValueError as e:
print("输入数据不能转为数字")
except LTOne as e: # e为异常类LTOne的实例
print("输入数字小于1", e)