异常

2017-07-12  本文已影响0人  Daydreamer_

异常就是程序运行错误或者逻辑混乱。需要给客户友好的提示。异常一般是程序中无法完全避免,一般通过一定的手段,尽量减少异常的发生。

当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"

1.捕获异常

1.1 try...except...

try:

    可能出现异常的代码

except:

    对异常信息做出的解释

#记录异常信息

except后不写任何类,表示捕捉任何异常。当出现异常,其实解析器会被这种异常分析,实例化得到一个异常对象 xx。然后再与except里的异常类进行匹配,如果能匹配,as将异常对象赋给ex

·把可能出现问题的代码,放在try中

·把处理异常的代码,放在except中

如:

path = input('输入文件的路径:')print('1......')

content = None

try:

    print('2......')

    content = open(path,'r',encoding='utf-8').read()

    a = 10/0

    print('3......')

except (FileNotFoundError,NameError,ZeroDivisionError) as ex:

    print('4......')

    print('输入的路径不存在')

    print(ex)

print('5......')

print(content)

如果输入错误路径,运行结果如下:

输入文件的路径:sd

1......

2......

4......

输入的路径不存在

[Errno 2] No such file or directory: 'sd'

5......

None

1.2 except捕获多个异常

开发的时候建议,捕捉异常要写的更详细。

但是一般直接用Exception。简单省事。

如果需要写很多异常类的描述,按照从小到大的顺序。

因为有一个捕捉到了异常。不会再被捕捉了。

注意:

·当捕获多个异常时,可以把要捕获的异常的名字,放到except后,并使用元组的方式仅进行存储

try:

num = 10/0

except Exception as ex:

print('2......')

except FileNotFoundError as ex:

print('0......')

except ZeroDivisionError as ex:

print('1......')

运行结果:

2......

try:

num = 10/0

except FileNotFoundError as ex:

print('0......')

except ZeroDivisionError as ex:

print('1......')

except Exception as ex:

print('2......')

运行结果:

1......

1.3 else

我们对else并不陌生,在if中,它的作用是当条件不满足时执行的实行;同样在try...except...中也是如此,即如果没有捕获到异常,那么就执行else中的事情

1.4 try...finally...

try:

pass

finally:

pass

try...finally...语句用来表达这样的情况:

在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。比如文件关闭,释放锁,把数据库连接返还给连接池等

2异常的传递

2.1 try嵌套

import time

try:

#f = open('test.txt')

f = open(r'C:\Users\Administrator\Desktop\xx.txt')

try:

while True:

content = f.readline()

if len(content) == 0:

break

num=1/0 #模拟一个异常

#time.sleep(2)

print(content)

#except:

#print('except...')

finally:

f.close()

print('关闭文件')

except:

print('没有这个文件')

运行结果:

没有这个文件

2.2 函数嵌套调用

·如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。

·如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样

def test1():

print("----test1-1----")

try:

print(num)

except:

print('test1  except......')

print("----test1-2----")

def test2():

print("----test2-1----")

test1()

print("----test2-2----")

def test3():

try:

print("----test3-1----")

test1()

print("----test3-2----")

except Exception as result:

print("捕获到了异常,信息是:%s"%result)

print("----test3-2----")

test3()

print("------华丽的分割线-----")

test2()

结果:

----test3-1----

----test1-1----

test1  except......

----test1-2----

----test3-2----

----test3-2----

------华丽的分割线-----

----test2-1----

----test1-1----

test1  except......

----test1-2----

----test2-2----

上一篇下一篇

猜你喜欢

热点阅读