异常

什么是异常?

捕捉异常try...except...

获取异常的信息描述

except捕获多个异常

try...finally

抛出异常

python使用异常对象来表示异常状态,并在遇到错误时引发异常。

异常对象未被处理(或者捕获)时,程序将终止并显示一条错误信息。

>>> 1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 

白话点:当python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”。

捕获异常 try...except...

异常比较有趣的地方是可以对其进行处理,称之为捕获异常,可使用try/except语句

tryprint('-------test----a-----')
    print('shanhaizhi.txt' , 'r' )
    print('-------test----b-----')           #可能产生异常的代码,放在try中
except IOERROR:
    pass                                     #如果产生错误时,处理的方法

#运行结果
-------test----a-----

则:

1.此程序看不到任何错误,因为用except接收了产生IOError错误,并添加了处理错误的方法

2.pass表示实现了相应的动作,但不会有任何输出;如果把pass改成print语句,那么就会有其他输出信息

小结:

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

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

获取异常的信息描述

如下:

tryprint num
except IOError:
    print('产生错误了')

#运行结果,依然可以看到报错信息
#原因是因为except捕获的错误类型是IOError,但是此时程序产生的异常是NameError,所以except没有生效

修改后代码:
tryprint num 
except NameError:
    print(‘产生错误了’)

在上面的案例中,以ing捕获到异常了,那么这个NameError异常,有没有信息描述呢?

在接收错误类型的后面定义一个变量(例如:errorMsg)用于接收具体错误信息,然后将接收的错误信息打印

tryprint num
except Nameerror,errorMsg:
    print(‘产生错误了;%s’ %errorMsg)

#运行结果
产生错误了;name ‘num’ is not defined

except捕获多个异常

#coding=utf-8
tryprint('--------test---a---')
    open('shanhaizhi.txt', 'r')
    #如果shanhaizhi.txt文件不存在,那么会产生IOError异常
    print(‘-------test---b---’)
    #如果num变量没有定义,那么会产生NameError异常
    print(num)
except (IOError,NameError),errorMsg:
    #如果像通过一次except捕获到多个异常可以用一个元组的方式

    #errorMsg里会保存捕获到的错误信息
    print(errorMsg)

运行结果:
--------test---a---
-------test---b---
name 'num' is not defined

则:

   如果像捕获所有的异常,可以省略except后面的变量。

try...finally...

作用:不管捕捉到的是什么错误,无论错误是不是发生,一些特殊代码读是必须要运行的,例如文件关闭、释放锁、把数据库链接返还给连接池等等

#案例
import time 
try:
    f=file('test.txt')
    while True:
        line = f.readline()
        if len(line)== 0:
            break
        time.sleep(2)
        print(line)

finally:
    f.close()
    print('关闭文件')

1.test.txt文件中每一行数据打印,在上述代码中,每打印一行之前使用time.sleep方法暂停2秒钟;让程序执行的慢一点。在程序执行的时候,按ctrl+c中断或者取消程序。

2.可看到 keyboardInterrupt异常出发,程序退出;但是在退出之前,finally从句仍然被执行,把文件关闭。

else

原本作用为当条件不满足时执行的操作条件

如果在try...except...中也是如此,即如果没有捕获到异常,那么就执行else中的操作

try:
    num = 100
    print num
except NameError,errorMsg:
    print('产生错误了:%s' %errorMsg)
elseprint(‘没有捕获到异常’)
finallyprint('我一定会执行')

#运行结果:
100
没有捕获到异常
我一定会执行

抛出异常

可使用raise语句来引发一个异常,;异常或者错误对象都必须有一个名字,且它们应该是 Erroe或者Exception类的子类

如下例引发异常的例子

class ShortInputException(Exception):
    '''你定义的异常类‘’‘
   def _init_(self,length,atleast):
        Exception._init_(self)
        self.length = length
        self.atleast = atleast

try:
    s = input(‘请输入 --->’)
    if len(s) < 3:
        #raise引发一个你定义的异常
        raise ShortInputException(len(s),3)

except EOFError:
    print("你输入了一个结束标记EOF")
except  ShortInputException,x: # x这个变量被绑定到了错误的实例
    print(‘ShortInputException:输入的长度是 %d,长度至少应该是 %d’ %(x.len(s)))
else:
    print('没有异常发生')

#运行结果:
>python raising.py
请输入 -->
你输入了一个结束标记EOF

>python raising.py
请输入 -->
ShortInputException:输入的长度是2,长度至少应该是3

>python raising.py
请输入 -->
没有异常发生
 
原文地址:https://www.cnblogs.com/FlameLuo/p/9689478.html