博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python之旅.第七章.异常处理
阅读量:7059 次
发布时间:2019-06-28

本文共 3656 字,大约阅读时间需要 12 分钟。

一、异常处理

1、什么是异常

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

 

2、一个异常分为三部分:

    1、异常的追踪信息

    2、异常的类型

    3、异常的值

 

3、异常的分类:

    1、语法异常:

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

        print('start....')

        x=1

        x+=1

        if

        print('stop....')

 

    2、逻辑上的异常

 

4、常见逻辑上的异常

IndexError

l=['a','b']

l[100]

 

KeyError

d={'a':1}

d['b']

 

AttributeError:

class Foo:

    pass

Foo.x

import os

os.aaa

 

ZeroDivisionError

1 / 0

 

FileNotFoundError

f=open('a.txt','r',encoding='utf-8')

 

ValueError: I/O operation on closed file.

f=open('a.txt','r',encoding='utf-8')

f.close()

f.readline()

 

ValueError: invalid literal for int() with base 10: 'aaaaa'

int('aaaaa')

 

TypeError

for i in 333:

    pass

 

NameError

x

func()

 

def func():

    import os

    os.xxxx

func()

 

5、语法:

try不影响正常程序的运行,遇到异常跳到except判断

单分支

try:

    print('start.....')

    x=1

    y

    l=[]

    l[3]

    d={'a':1}

    d['b']

    print('end....')

except NameError:

    print('变量名没有定义')

print('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.....')

 

多种异常采用同一段逻辑处理

try:

    print('start.....')

    x=1

    # y

    l=[]

    # l[3]

    d={'a':1}

    d['b']

    print('end....')

except (NameError,KeyError,IndexError):

    print('变量名或者字典的key或者列表的索引有问题')

print('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.....')

 

获取异常的值

try:

    print('start.....')

    x=1

    y

    l=[]

    l[3]

    d={'a':1}

    d['b']

    import os

    os.aaa

    print('end....')

except Exception as e: # except NameError as e:

    print('万能异常---',e)

print('other.....')

 

try:

    print('start.....')

    x=1

    # y

    l=[]

    l[3]

    d={'a':1}

    d['b']

    import os

    os.aaa

    print('end....')

except NameError as e:

    print('NameError: ',e)

except KeyError as e:

    print('KeyError: ',e)

except Exception as e:

    print('万能异常---',e)

print('other.....')

 

try....else...

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

 

try:

    print('start.....')

    # x=1

    # # y

    # l=[]

    # l[3]

    # d={'a':1}

    # d['b']

    # import os

    # os.aaa

    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.....')

 

try...finally....

try:

    print('start.....')

    # x=1

    # # y

    # l=[]

    # l[3]

    # d={'a':1}

    # d['b']

    # import os

    # os.aaa

    print('end....')

except NameError as e:

    print('NameError: ',e)

except KeyError as e:

    print('KeyError: ',e)

except Exception as e:

    print('万能异常---',e)

else:

    print('在被检测的代码块没有出现任何异常的情况下执行')

finally:

    print('无论有没有异常发生,都会执行')

print('other.....')

 

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

try:

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

    f.readline()

finally:

    f.close()

print('other....')

 

try+except

try+except+else

try+finally

try+except+else+finally

 

6、主动触发异常

raise TypeError('类型错误')

 

class People:

    def __init__(self,name):

        if not isinstance(name,str):

            raise TypeError('%s 必须是str类型' %name)

        self.name=name

p=People(123)

 

7、断言

print('part1........')

# stus=['egon','alex','wxx','lxx']

stus=[]

 

# if len(stus) <= 0:

#     raise TypeError

 

assert len(stus) > 0

 

print('part2.........')

print('part2.........')

print('part2.........')

print('part2.........')

print('part2.........')

print('part2.........')

 

8、自定义异常

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')

 

在可以知道异常是什么时候用if,在知道有异常但不确定异常是什么的情况下可用try

尽量少使用try等,避免使结构看上去过于复杂

age=input('>>: ').strip() #age='aaa'

 

if age.isdigit():

    age=int(age)

 

    if age > 10:

        print('too big')

    elif age < 10:

        print('too small')

    else:

        print('you got it')

 

 

转载于:https://www.cnblogs.com/yangli0504/p/8877118.html

你可能感兴趣的文章
内存, 硬盘, CPU是拿什么材料制作的? 电子管, 晶体管与计算机硬件的发展史.
查看>>
数据库备份 恢复
查看>>
Jmeter
查看>>
Automatic Truncation of Virtual Log Files(VLFs的自动截断)
查看>>
[Z]寻找第K大的数的方法总结
查看>>
javascript一些常用代码块
查看>>
利用EntityFramework获得双色球数据库
查看>>
IOS4.0与5.0解决键盘的冲突
查看>>
mongo-mapreduce测试(10)——阶段总结(2)
查看>>
Setting an Oracle event:The structure of the trace syntax
查看>>
CSS+DIV:父DIV相对定位+子DIV绝对定位
查看>>
DBCC--SHRINKDATABASE
查看>>
我的开源路声明
查看>>
C# 图像处理:获取鼠标位置信息(全局)
查看>>
angular学习笔记(一)-入门案例
查看>>
jQuery hover事件鼠标滑过图片半透明标题文字滑动显示隐藏
查看>>
BackTrack5 (BT5)无线password破解教程之WPA/WPA2-PSK型无线password破解
查看>>
jQuery修改class属性和CSS样式
查看>>
Web.xml配置具体解释之context-param
查看>>
Qt Widgets——抽象按钮及其继承类
查看>>