zoukankan      html  css  js  c++  java
  • 异常

    什么是异常?

    捕捉异常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
    请输入 -->
    没有异常发生
     
  • 相关阅读:
    游戏方案
    团队介绍
    【面向对象程序设计】作业四
    FIFO与LRU实现(Java)
    spring事务介绍
    微信抢红包算法
    Hibernate Dao映射配置通用接口类反射获取加载calass实例
    股票两次买卖最大收益(java)
    Eclipse安装JD-Eclipse反编译插件看源码
    Java GC调优
  • 原文地址:https://www.cnblogs.com/FlameLuo/p/9689478.html
Copyright © 2011-2022 走看看