在python程序运行过程中,遇到错误就会中断程序,但是在实际操作中,我们往往不希望因为这些小小的错误,导致程序无法运作,所以python中引入了异常捕获机制,使程序遇到错误时会提醒我们但是不会中断程序
目录
1.常见异常:
NameError : 访问一个不存在的变量
print(a)
# NameError: name 'a' is not defined
InentdationError :缩进语法错误
print("hello")
# IndentationError: unexpected indent
IndexError :索引错误
lst = [1, 2, 3, 4]
print(lst[5])
# IndexError: list index out of range
SyntaxError :python语法错误
print("hello".)
# SyntaxError: invalid syntax
KeyError :键值错误,查找一个没有的键值
d1 = {"name": "yjx"}
print(d1["age"])
# KeyError: 'age'
AttributeError :尝试访问一个对象没有的属性
s1 = {1, 2, 3}
s1.append(3)
print(s1)
# AttributeError: 'set' object has no attribute 'append'
ValueError :传值错误
int("abc")
# ValueError: invalid literal for int() with base 10: 'abc'
AssertionError :断言异常,程序的输出结果和猜测相反
num1 = input("input num1:")
num2 = input("input num2:")
assert num1 > num2
# input num1:1
# input num2:3
# assert num1>num2
# AssertionError
TypeError : 类型错误
a = 3.1415926
b = "abc"
print(a + b)
# TypeError: unsupported operand type(s) for +: 'float' and 'str'
ZeroDivisionError :除数为0
print(100/0)
# ZeroDivisionError: division by zero
2.异常处理(异常发生时做特殊处理,不终止程序)
try...except... :打开一个不存在的文件,发生了异常,于是执行except输出nosuchfile最后执行print(”end“)语句
try:
print("strat>>>>>")
fp = open("yjx.txt")
print("end....")
except:
print("nosuchfile")
print("end")
# strat>>>>>
# end....
# end
不指定except类型时,默认抛出exception类,exception是很多常见异常的父类,,同一个try...except...异常捕获机制里可以有多个except类,但是只要捕获到其中一个符合条件就不会再去配对是否符合后面的类型(有点类似于ifelse语句),所以要把父类写在最前面不然后面的子类会失效。
try:
print("strat>>>>>")
int("abc")
print("end....")
except ValueError:
print("传值错误")
except:
print("nosuchfile")
print("end")
# strat>>>>>
# 传值错误
# end
我们还可以将异常实例化
try:
print("strat>>>>>")
int("abc")
print("end....")
except ValueError as e:
print(e)
except:
print("nosuchfile")
print("end")
# strat>>>>>
# invalid literal for int() with base 10: 'abc'
# end
else、finally语句:执行了except语句就不会执行else语句,但是无论异常是否捕获成功、无论是否执行了except语句,都会执行finally语句
else:
try:
print("else test>>>")
int("abc")
except ValueError:
print("value error")
else:
print("捕获异常失败")
# else test>>>
# value error
finally:
try:
print("else test>>>")
int("abc")
except ValueError:
print("value error")
finally:
print("else test end...")
# else test>>>
# value error
# else test end...
3.手动抛出异常
四种方法:raise 关键字、raise、raise 异常类、raise 异常类(说明信息)
print("raise start")
raise IndexError("说明信息")
print("end raise...")
# IndexError: 说明信息
4.我们为什么要手动抛出异常?
错误:错误是语法或是逻辑上的,语法上的错误是指:软件结构的错误导致不能被解释器解释或编译,这种错误会在程序执行前就抛出,逻辑错误是指由不完整或者不合法的输入导致的错误
当python检测到一个错误的时候,解释器就会指出当前已经无法继续执行程序,这个时候就出现了异常
异常:异常就是程序出现错误以后,在正常操作意外产生的行动就叫异常处理
python支持引发和处理异常大大大提高了应用程序的健壮性
通俗的理解就是抛出异常大大大提高了用户体验,程序会捕获这个异常 给用户一个良好的出错提示,同时我们可以在后端改进。