python 异常处理

python 异常处理,第1张

异常处理 一、异常和错误

什么是错误
• 语法错误(大小写拼写错误、括号不匹配等…)=> 不能正常执行
• 逻辑错误(程序运行正常,只是最后结果不符合预期)
什么是异常
• 程序运行过程中,出现的意料之外的错误
• 如:打开的文件不存在、被除数为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…

4.1 异常处理执行顺序

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("请输入成绩:")

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/942345.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-18
下一篇 2022-05-18

发表评论

登录后才能评论

评论列表(0条)

保存