Python异常处理

什么是异常及为什么要异常处理

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

为什么要异常处理

python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。

所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性 

如何进行异常处理

首先须知,异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行前就修正

使用if进行错误处理

num1=input('>>: ') #输入一个字符串试试

if num1.isdigit():

    int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴

elif num1.isspace():

    print('输入的是空格,就执行我这里的逻辑')

elif len(num1) == 0:

    print('输入的是空,就执行我这里的逻辑')

else:

    print('其他情情况,执行我这里的逻辑')

'''
问题一:
使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂

问题二:
这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
'''

总结:

1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。

2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差

3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。

异常处理try

python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理

基本语法

try:

     被检测的代码块

except 异常类型:

     try中一旦检测到异常,就执行这个位置的逻辑

例一:

try:

    name

except NameError:

    print(123123)

例二

try:

    f = open('a.txt')

    g = (line.strip() for line in f)

    print(next(g))

    print(next(g))

    print(next(g))

    print(next(g))

    print(next(g))

except StopIteration:

    f.close()

#next(g)会触发迭代f,依次next(g)就可以读取文件的一行行内容,无论文件a.txt有多大,同一时刻内存中只有一行内容。

#提示:g是基于文件句柄f而存在的,因而只能在next(g)抛出异常StopIteration后才可以执行f.close()

异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。

s1 = 'hello'

try:

    int(s1)

except IndexError as f:

    print(f)

多分支

s1 = 'hello'

try:

    int(s1)

except IndexError as e:

    print(e)

except KeyError as e:

    print(e)

except ValueError as e:

    print(e)

Exception万能异常

万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常,即:

s1 = 'hello'

try:

    int(s1)

except Exception as f:

    print(f)

你可能会说既然有万能异常,那么我直接用上面的这种形式就好了,其他异常可以忽略

你说的没错,但是应该分两种情况去看

1.如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么只有一个Exception就足够了。

s1 = 'hello'

try:

    int(s1)

except Exception,e:

    #丢弃或者执行其他逻辑

    print(e)

#如果你统一用Exception,没错,是可以捕捉所有异常,但意味着你在处理所有异常时都使用同一个逻辑去处理(这里说的逻辑即当前expect下面跟的代码块)

2.如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。

s1 = 'hello'

try:

    int(s1)

except IndexError as e:

    print(e)

except KeyError as e:

    print(e)

except ValueError as e:

    print(e)

except Exception as e:

    print(e)

#多分支+Exception

finally

s1 = 'hello'

try:

    int(s1)

except IndexError as e:

    print(e)

except KeyError as e:

    print(e)

except ValueError as e:

    print(e)

else:

    print('try内代码块没有异常则执行我')

finally:

    print('无论异常与否,都会执行该模块,通常是进行清理工作')

自定义异常

try:

raise TypeError('类型错误')

except Exception as e:

    print(e)
class HaoException(BaseException):

    def __init__(self,msg):

        self.msg=msg

    def __str__(self):

        return self.msg

try:

    raise HaoException('类型错误')

except HaoException as e:

    print(e)

断言

# assert 条件

 assert 1 == 1

 assert 1 == 2

#和if条件一样的

if not 1 == 2:

    raise AssertionError

print(123)

异常处理中的注意事项
1、要细粒度的 对个别行代码做异常处理
2、尽量针对特有的错误类型做处理而不是直接用万能异常,一旦用万能异常 一定要把错误信息打印出来

posted @ 2018-07-23 11:52  杨灏  阅读(199)  评论(0编辑  收藏  举报