错误分为两种,一种为语法错误,一种为逻辑错误
异常就是程序运行错误时发出的型号,或者说是程序运行崩溃的结果
常用异常:
AttributeError
试图访问一个对象没有的属性,比如调用Foo.x,但是Foo下没有x属性
IOError
输入/输出异常,基本上是无法打开文件的
ImportError
无法引入模块或包,基本上是路径问题或者名称错误
IndentationError
语法错误的子类,代码没有正确对齐
IndexError
下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyboardInterrupt
这个是在解释器中按下了ctrl+c
NameError
使用了一个还未被赋予对象的变量
SyntaxError
非法python代码,个人觉得就是语法错误
TypeError
传入对象类型与要求类型不符合
UnboundLocalError
视图访问一个还未被设置的局部变量,基本上是犹豫另一个同名的全局变量,导致你认为正在访问它
ValueError
传入一个调用者不期望的值,即使值得类型是正确的
为什么要进行异常处理?
异常处理的目的就是捕捉到产生异常的代码,使整个代码不会崩溃而终止,让逻辑继续走下去
其实if
也可以做异常处理,但是if的缺点很多,比如说重复代码的使用和可读性差等等:
def test():
print('lalalalalalala')
chioce = {
'1':test
}
while True:
chioce_q = input('>>>:').strip()
if not chioce or chioce_q not in chioce:
continue
chioce[chioce_q]()
所以python唯每一种异常定制了一个类型,然后提供了一种特定的语法结构来进行异常处理
try:
被检测的代码块
exxept 异常类型:
try中一旦检测到异常,就执行这个位置的逻辑代码
下面是一个将输入的字符转换成为int类型的异常处理:
try:
age = input('>>>')
int(age)
num = input('>>')
int(num)
except ValueError as e:#as是给他起个名字
print(e)
异常类只能用来处理指定的异常情况,如果非指定异常则无法处理,比如说你在except
后面写的是ValueError
但是是因为超出取值范围导致的异常,程序还是会终止,这时就可以用多分支或者万能异常来处理:
多分支:
try:
age = input('>>')
int(age)
l = [1,2]
l[10]
except ValueError as e:
print(e)
except IndexError as e:
print(e)
万能异常:
try:
age = input('>>>')
int(age)
l = [2.3]
l[10]
except Exception as e:
print(e)
Exception表示所有的异常都按照一种逻辑去处理,但是假如需要不同的异常需要定制不同的处理,就需要使用多分支了,也可以在多分支后面也加入一下Exception,就相当于if…elif…else
但是try中也else,但是和if…else中的截然相反
try:
监测代码
except Exception:
异常后的逻辑代码
else:
print('try中代码块没有异常则执行我')
finally:
print('无论一场与否,都会执行我,通常是进行清理工作')
#比如说打开文件然后操作文件导致文件未关闭
断言
关键字assert
def test1():
res = 1
return 1
res1 = test1()
assert res1 == 2
#上面的assert和下面的if一致
if res1 != 2:
raise AttributeError
然而try…except应该少用,因为他本身就是你附加给你程序的一种异常处理的逻辑,与你的主要工作是没有关系的,只有在有些一场无法预知的情况下才应该加上try…except,其他逻辑错误应该尽量修正