python的异常处理try/except 万能处理exception

1、try方式

try:
    age=int(input(">>>"))
    int(age)#主逻辑

    num=input(">>>>")
    int(num)#主逻辑
except ValueError as e:   #except代表捕捉的意思,as,把ValueError取个别名叫e
    print(e)
#表示代码在执行过程中遇到异常之后直接跳到except

C:\python35\python3.exe D:/pyproject/day31/错误与异常.py

>>>23

>>>>dd

invalid literal for int() with base 10: 'dd'

那如果出现了其他的类型的错误呢。我们上面这个只能捕捉到这一种错误类型

2、try多分支异常处理,类似于elif

try:
    age=int(input(">>>"))
    int(age)#主逻辑

    num=input(">>>>")
    int(num)#主逻辑
except KeyError as e:   #except代表捕捉的意思,把ValueError取个别名叫e
    print(e)
except ValueError as e:
    print("--->",e)

C:\python35\python3.exe D:/pyproject/day31/异常处理.py

>>>aa

---> invalid literal for int() with base 10: 'aa'

2.1上面这是2种错误,那么如果再来一种错误呢

try:
    age=int(input(">>>"))
    int(age)#主逻辑

    num=input(">>>>")
    int(num)#主逻辑

    l=[1,2,3]
    l[666666]#取一个不存在的索引就会触发IndexError
except KeyError as e:   #except代表捕捉的意思,把ValueError取个别名叫e
    print(e)
except ValueError as e:
    print("--->",e)
except IndexError as e:
    print("索引错误",e)

C:\python35\python3.exe D:/pyproject/day31/异常处理.py

>>>1

>>>>2

索引错误 list index out of range

2.2如果try里面的代码运行有错误了,并不影响try外面的代码的继续运行的

try:
    age=int(input(">>>"))
    int(age)#主逻辑

    num=input(">>>>")
    int(num)#主逻辑

    l=[1,2,3]
    l[666666]#取一个不存在的索引就会触发IndexError
except KeyError as e:   #except代表捕捉的意思,把ValueError取个别名叫e
    print(e)
except ValueError as e:
    print("--->",e)
except IndexError as e:
    print("索引错误",e)
print("我是try外面的逻辑,我可以正常运行")

C:\python35\python3.exe D:/pyproject/day31/异常处理.py

>>>11

>>>>sdsf

---> invalid literal for int() with base 10: 'sdsf'

我是try外面的逻辑,我可以正常运行

3、那么还有好多的异常类型呢,总不能一个一个的都加上去吧,这时候就用到了万能异常

Exception

这样的话不管什么错误都可以捕捉的到了。

try:
    age=int(input(">>>"))
    int(age)#主逻辑

    num=input(">>>>")
    int(num)#主逻辑

    l=[1,2,3]
    l[666666]#取一个不存在的索引就会触发IndexError
except Exception as e:  

    print("万能异常",e)
print("我是try外面的逻辑,我可以正常运行")

C:\python35\python3.exe D:/pyproject/day31/异常处理.py

>>>111

>>>>sdfdsf

万能异常 invalid literal for int() with base 10: 'sdfdsf'

我是try外面的逻辑,我可以正常运行 

3.1 try  else  当代码块中没有异常则触发else

try:
    age=int(input(">>>"))
    int(age)#主逻辑

    num=input(">>>>")
    int(num)#主逻辑

except Exception as e:   #except代表捕捉的意思,把ValueError取个别名叫e
    print("万能异常",e)
else:
    print("没有异常就执行我")
print("我是try外面的逻辑,我可以正常运行")

C:\python35\python3.exe "D:/pyproject/day31异常处理 socket介绍/异常处理.py"

>>>11

>>>>22

没有异常就执行我

我是try外面的逻辑,我可以正常运行

3.2 finally   不管有没有异常都执行这段代码块

try:
    age=int(input(">>>"))
    int(age)#主逻辑

    num=input(">>>>")
    int(num)#主逻辑

except Exception as e:   #except代表捕捉的意思,把ValueError取个别名叫e
    print("万能异常",e)
finally:
    print("无论是否异常都执行这段代码,通常是进行清理操作")
print("我是try外面的逻辑,我可以正常运行")

C:\python35\python3.exe "D:/pyproject/day31异常处理 socket介绍/异常处理.py"

>>>11

>>>>sddsdf

万能异常 invalid literal for int() with base 10: 'sddsdf'

无论是否异常都执行这段代码,通常是进行清理操作

我是try外面的逻辑,我可以正常运行

3.3我想达到这样的效果,如果用户输入的不对,就让他重新输入,知道正确为止

while True:
    try:
        age=int(input(">>>"))
        int(age)#主逻辑
        break
    except Exception as e:
        print("请重新输入",e)
print("我是try外面的逻辑,我可以正常运行")

C:\python35\python3.exe D:/pyproject/day31/异常处理.py

>>>222ss

请重新输入 invalid literal for int() with base 10: '222ss'

>>>11

我是try外面的逻辑,我可以正常运行

万能异常的缺点就是,假如你有一万行代码,不管啥错误都报这个,那你就不知道是哪里错了。。。

posted @ 2018-06-26 10:16  gouguoqi  阅读(8016)  评论(0编辑  收藏  举报