python 之 面向对象 (异常处理)

7.15 异常处理

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

2、一个异常分为三部分: 异常的追踪信息 异常的类型 异常的值

3、异常的分类: 语法异常,逻辑上的异常

语法:

单分支
try:
     print('start.....')
     x=1
     y
     l=[]
     l[3]
     d={'a':1}
     d['b']
     print('end....')
 except NameError:
     print('变量名没有定义')
print('other.....')         #start..... 变量名没有定义 other.....
多分支
try:
    print('start.....')
    x=1
    # y
    l=[]
    l[3]
    d={'a':1}
    d['b']
    print('end....')
except NameError:
    print('变量名没有定义')
except KeyError:
    print('字典的key不存在')
except IndexError:
    print('索引超出列表的范围')
print('other.....')     # start.....  索引超出列表的范围 other.....
多种异常采用同一段逻辑处理
try:
    print('start.....')
    x=1
    # y
    l=[]
    # l[3]
    d={'a':1}
    d['b']
    print('end....')
except (NameError,KeyError,IndexError):
    print('变量名或者字典的key或者列表的索引有问题')
print('other.....') #start.....  变量名或者字典的key或者列表的索引有问题  other....
万能异常
try:
    print('start.....')
    x=1
    # y
    l=[]
    # l[3]
    d={'a':1}
    # d['b']
    import os
    os.aaa
    print('end....')
except Exception:
    print('万能异常---》')
print('other.....') #start..... 万能异常---》other.....
获取异常的值
try:
    print('start.....')
    x=1
    y
    l=[]
    l[3]
    d={'a':1}
    d['b']
    import os
    os.aaa
    print('end....')
except Exception as e:
    print('万能异常---》',e)
print('other.....')#start.....  万能异常---》 name 'y' is not defined  other.....

7.151 try....else...

else: 不能单独使用,必须与except连用,意思是:else的子代码块会在被检测的代码没有出现过任何异常的情况下执行

try:
    print('start.....')
    # x=1
    # # y
    print('end....')
except NameError as e:
    print('NameError: ',e)
except KeyError as e:
    print('KeyError: ',e)
except Exception as e:
    print('万能异常---》',e)
else:
    print('在被检测的代码块没有出现任何异常的情况下执行')
print('other.....')#start.....  end....  在被检测的代码块没有出现任何异常的情况下执行 other.....

7.152 try...finally....

try:
    print('start.....')
    # x=1
    # # y
    print('end....')
except Exception as e:
    print('万能异常---》',e)
finally:
    print('无论有没有异常发生,都会执行')
print('other.....')#结果:start..... end.... 无论有没有异常发生,都会执行 other.....
#如果检测到异常:start..... 
#万能异常---》  name 'y' is not defined 
#无论有没有异常发生,都会执行 other.....

finally的子代码块中通常放回收系统资源的代码

try:
    f=open('a.txt',mode='w',encoding='utf-8')
    f.readline()
finally:
    f.close()
print('other....') #报错 但文件关闭  (other....不执行)

7.153 主动触发异常

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

断言

stus=[]
assert len(stus) > 0
print('part2.........')
print('part2.........') #AssertionError

自定义异常

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')   #__main__.RegisterError: <teacher:注册失败>
posted @ 2019-07-10 21:19  small_white-  阅读(460)  评论(0编辑  收藏  举报