python 之 异常处理

异常基础

我们在写程序的时候难免会出现错误,一种为语法错误,即为python解释器的语法检测出来的错误,这种错误只能在我们执行程序之前及处理好。另一种为逻辑错误,这是我们在程序设计时出现得错误,也就是我们平时所说的bug。在编程过程中为了增加友好性,在程序出现bug的时候,一般不会将错误信息显示给用户,而是显示一个提示错误的页面。

异常种类

在python中不同异常可以用不同的类型去标识,不同的类对象标识不同的异常,一个异常标识一种错误。

常见异常
更多异常

什么是异常处理:

 

python解释器捕捉到错误,触发异常(程序员也可以自己触发异常)

程序员编写的特定的代码,专门用来捕捉这段异常(这段代码与逻辑无关,与异常处理有关)

如果捕捉成功,会进入另一个处理分支,使得程序不会崩溃,这就是异常处理。

为什么要进行异常处理:

python解释器在执行程序,检测到一个错误的时候,触发异常,异常触发后如果没有处理的情况下,程序会再当前异常终止,后面的代码就不会运行,这意味着你的程序崩溃了。

所以需要一种异常处理的机制来增强你程序的容错性。

如何进行异常处理:

首先,异常是由程序的错误引起的,但是语法上的错误跟异常处理无关,只能在程序运行前修正。

基本语法:

try:
    pass#被检测的代码块
except Exception as e:
    pass#错误提示

实例:

try:
    num = input('please input you num:')
    #遇到无法int的对象使用except捕捉
    int(num)
    #捕捉Value 错误,返回错误
except ValueError as e:
    print(e)
# 执行结果
#please input you num: name
# invalid literal for int() with base 10: ' name'

在try 代码中只要出现异常,那么代码块中异常后面的代码就不会执行了,一个异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

多分支:

age = input('age:')
try:
    int(age)
except IndexError as e:#未捕捉到错误
    print(e)
except KeyError as e:#未捕捉到错误
    print(e)
except ValueError as e:#捕捉到错误
    print('请输入数字')
#######执行结果##########
# age:f   输入类型不是数字
# 请输入数字      捕捉到错误,返回提示信息

多分支扩展:

print('执行结果'.center(30,"#"))
age = input('age:')
try:
    int(age)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print('请输入数字')
else:
    print('没try出来错误执行,try出来错误就不执行')
finally:
    print('不管你有没有try出来错误都执行我')

print('执行结果'.center(30,"#"))
#############执行结果#############
# age:ddd
# 请输入数字
# 不管你有没有try出来错误都执行我
#############执行结果#############

万能异常

每一类错误都用一种类对象标识,太麻烦了,这个时候你就需要万能异常了,各种错误一网打尽。

但是还有三个漏网之鱼,SystemExit , KeyboardInterrupt 和 GeneratorExit 三个异常是Exception搞不定的。

print('执行结果'.center(30,"#"))
age = input('age:')
try:
    int(age)
except Exception as e:#不使用ValueError照样能捕捉到错误
    print(e)
print('执行结果'.center(30,"#"))
#############执行结果#############
# age:s
# invalid literal for int() with base 10: 's'
#############执行结果#############

主动触发异常

print('执行结果'.center(30,"#"))
try:
    raise TypeError('类型错误')
except Exception as e:
    print(e)
print('执行结果'.center(30,"#"))
#############执行结果#############
# 类型错误
#############执行结果#############

自定义异常

通过继承BaseException实现

print('执行结果'.center(30,"*"))
class NaniException(BaseException):
    def __init__(self,msg):
        self.msg = msg
    def __str__(self):
        return self.msg
try:
    raise NaniException('纳尼错误')
except NaniException as e: #捕获NaniException
    print(e)
finally:
    print('执行结果'.center(30,"*"))
# *************执行结果*************
# 纳尼错误
# *************执行结果*************

断言

判断条件成立,不成立就出现AssertionError异常

try:
    assert 1 == 1
    print('第一个断言成功就执行')
    assert 2 == 1
    print('第二个断言失败不执行')
except Exception as e:
    print('抓到错误')

注意:

  不要再任何地方都使用try......except,因为它本身就是你附加给你程序的一种异常处理的逻辑,与你的主要工作是没有关系的,大量使用,会导致你的程序的可读性变差,只有在有些异常无法预知的情况下,才应该使用try...... except,其它的逻辑错误应该尽量自行修正。

 

posted on 2017-08-19 13:48  keepDoing  阅读(128)  评论(0编辑  收藏  举报

导航