什么是异常处理以及异常处理的方式

错误分为两种,一种为语法错误,一种为逻辑错误
异常就是程序运行错误时发出的型号,或者说是程序运行崩溃的结果
常用异常:
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,其他逻辑错误应该尽量修正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章