(python)异常处理

一、什么是异常

    异常是错误发生的信号。程序一旦出错,如果程序中没有相应的处理机制,那么该错误就会产生一个异常抛出来,程序也随之终止

    一个异常分为三部分:


    1、是异常的:追踪信息

    2、是异常的:类型(类)

    3、是异常的:


二、异常分类

1、语法异常:

这类异常应该在程序执行前就应该改正

2、逻辑上的异常:

(常见常用的如下)

IndexError(超出索引范围)

KeyError(字典里不存在这个键)

AttributeError(访问一个对象的属性,但这个对象却没有这个属性。产生属性异常)

IOError(输入\输出异常,一般是打不开文件)

ZeroDivisionError(如1/0)

FileNotFoundError(文件不存在)

TyepError(传入的对象类型与要求的不符合)

NameError(使用一个未被赋值的变量)

ValueError(传入一个调用者不期望的值,即使传入的值的类型没问题)




三、异常处理

try:
    print('start.....')
    a
    l=['a','b']
    l[6]
    d={'a':1}
    d['b']
    print('end......')
except NameError:
    print('变量没有定义')
except IndexError:
    print('索引超出范围')
except KeyError:
    print('字典的key不存在')

print('other')

结果为:


上面的异常也可以用下图中的一个逻辑来粗略的处理


还有用一个粗略处理异常是万能异常(Exception)


用万能异常处理是不知道具体是异常的名字,但我们已经了解异常分为三部分,我们可以把这个异常的值,赋值给一个变量来判断它什么异常。

try:
    print('start....')
    import os
    os.aaa
    a
    l=['a','b']
    l[6]
    d={'a':1}
    d['b']
    print('end......')
except Exception as e :
    print('万能异常---》',e)

print('other....')

结果为:


这时我们就可以通过得到的异常的值,就可以推断出它是一个AttributeError。

也可以单独的拿出一种异常来处理,其它的异常做粗略处理。:



try...excpt....else....finally处理异常的用法:

else:必须与except连用,意思是:else里的代码块在没有异常的情况下会被执行。


finally:无论有没有异常,finally代码块都会执行!!!


看下面的代码就要用到finally来回收资源的问题,

try:
    f=open('a.txt',mode='w',encoding='utf-8')
    f.readline()
    f.close()
except Exception as e:
    print(e)
        上面的代码读代码出现了异常,但是文件已经打开了,抛出异常后就没有将文件给关闭,所以我们就要让它不管有没有异常执行完后都要关闭文件资源。

所以上面的代码要进行一个修改如下:

try:
    f=open('a.txt',mode='w',encoding='utf-8')
    f.readline()

except Exception as e:
    print(e)
finally:
    f.close()

主动触发异常:


class People:
    def __init__(self,name):
        self.name=name
        if not isinstance(name,str):
            raise TypeError('%s 必须是str类型'%name)

        self.name=name
p=People(123)

结果显示为:



四、断言


五、自定义异常

class RegisterError(BaseException):
    def __init__(self,msg,user):
        self.msg=msg
        self.user=user
    def __str__(self):
        return '<%s,%s>'%(self.user,self.msg)

# raise  RegisterError('注册失败','teacher')
obj=RegisterError('注册失败','teacher')
print(obj)

最后我们什么时候用异常处理呢!!!

        当错误的条件是可以预知的,就不要弄异常处理用if条件判断在发生错误前进行预防。但有很多的异常我们不能预测,所以就要捕获异常处理。

总结:

        捕获异常(try...execpt),它把错误处理和真正要运行的代码分开、代码更有组织结构,代码运行更加安全,不会因一些小错误而导致崩溃。

猜你喜欢

转载自blog.csdn.net/miaoqinian/article/details/79983844