什么是错误
• 语法错误(大小写拼写错误、括号不匹配等…)=> 不能正常执行
• 逻辑错误(程序运行正常,只是最后结果不符合预期)
什么是异常
• 程序运行过程中,出现的意料之外的错误
• 如:打开的文件不存在、被除数为0、 *** 作的数据类型不对、存储错误,互联网请求错
误…
遇到错误 异常,程序就终止了
print("start....")
fp = open('test.txt')
print("end....")
#Traceback (most recent call last):
# File "E:/python project/sanchuang/10)python的异常处理/01.python异常处理.py", line 10, in
# fp = open('test.txt')
#FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
start....
二、回溯信息
回溯信息:当程序运行时,发生了未处理的异常,Python就将终止执行程序,并以堆栈回溯(Traceback,也称向后追踪)的形式显示异常发生的上下文。
回溯信息告诉我们应该去哪里寻找问题的根源,对解决问题非常有帮助。
Traceback (most recent call last):
File "E:/python project/sanchuang/10)python的异常处理/01.python异常处理.py", line 10, in <module>
fp = open('test.txt')
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
三、常见异常类
#NameError 变量名没有被定义
print(abc)
#ZeroDivisionError 除数为0异常
print(1/0)
#SyntaxError 语法错误
if 1>0::
print("ok")
#IndexError 索引错误
lst = [1,2,3]
print(lst[5])
#KeyError 请求一个不存在的字典关键字
a = {"s1":1}
print(a.get("s2",0))
print(a["s2"])
#AttributeErro 属性错误
import random
random.xxx()
#ValueError 传递的值错误
int("abc")
#AssertionError 断言错误,一般用于测试
a = 3
b = 4
assert a>b
#IndentationError 缩进错误
print("abc")
四、异常处理机制
在代码被解释执行的过程中可能会抛出异常。
那么也就是说,可能会发生,可能不会发生。对于这么不可预测的异常状态如何处理?
1:即使程序出错,也不想让程序终止
2:如果出错了,需要特殊处理
我们就可以用到异常处理机制 try…except…
try:
fp = open("test.txt")
except:
print("no such test.txt")
print("end...")
#运行结果
#no such test.txt
#end...
# except捕获错误与触发的错误不一致,程序就捕获不到,然后抛出异常
# except可以有多个
# except 匹配到第一个就退出
# 如果父类异常捕获放在最前面,就会吞噬后面所有的子类异常
try:
a = 1/0 #除数为0错误
except ValueError as e: #捕获值错误
print(e) #触发错误与捕获错误不一致,还是会抛出异常
# 运行结果
# Traceback (most recent call last):
# File "E:/python project/sanchuang/10)python的异常处理/01.python异常处理.py", line 73, in
# a = 1/0 #除数为0错误
# ZeroDivisionError: division by zero
try:
a = 1/0
except ValueError as e:
print(e)
except ZeroDivisionError:
print("除数为0")
except Exception:
print("this is exception")
# 除数为0
4.2 else和finally结构
else结构:没有任何异常发生的时候执行的
finally 不管有没有异常,不管异常有没有被捕获,都执行
# 没有异常,执行else结构
try:
print("else test....")
except:
print("error")
else:
print("else test end...")
# 运行结果
# else test....
# else test end...
# 捕获到异常,不会执行else结果
try:
1/0
print("else test....")
except:
print("error")
else:
print("else test end...")
# 运行结果
# error
#有没有捕获到异常,都会执行finally结构
try:
print("else test....")
1/0
except ValueError: # 触发异常与捕获异常不一致抛出异常也会执行finally
print("error")
else:
print("else test end...")
finally:
print("i am finally")
# 运行结果
# else test....
# i am finally
# Traceback (most recent call last):
# File "E:/python project/sanchuang/10)python的异常处理/01.python异常处理.py", line 112, in
# 1/0
# ZeroDivisionError: division by zero
# 函数里面return语句退出函数之后也会执行finally
def func1():
try:
print("else test....")
1 / 0
except:
print("error")
return
else:
print("else test end...")
finally:
print("i am finally")
func1()
# 运行结果
# else test....
# error
# i am finally
4.3 手动触发异常
手动抛出异常 使用raise关键字
使用场景:当封装了函数、类,用户提供的数据,无法进行后续的计算,只能引发一个异常
raise 异常类
raise 异常类(说明信息)
print("start raise...")
raise IndexError
print("end raise...")
#Traceback (most recent call last):
# File "E:/python project/sanchuang/10)python的异常处理/01.python异常处理.py", line 157, in
# raise IndexError
#IndexError
#start raise...
print("start raise...")
raise IndexError("this is test")
print("end raise...")
#Traceback (most recent call last):
# File "E:/python project/sanchuang/10)python的异常处理/01.python异常处理.py", line 152, in
# raise IndexError("this is test")
#IndexError: this is test
#start raise...
练习
def score_to_grade(score:int):
try:
score = int(score)
except ValueError:
raise ValueError("成绩数据必须要是int或者int类型的字符串")
if 0 <= score <= 59:
grade = 'B'
return grade
elif score>=60:
grade = 'A'
return grade
else:
raise IOError("成绩超出范围")
score = input("请输入成绩:")
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)