zoukankan      html  css  js  c++  java
  • 异常

    异常类型

     

    python标准异常

    异常名称

    描述

    BaseException

    所有异常的基类

    SystemExit

    解释器请求退出

    KeyboardInterrupt

    用户中断执行(通常是输入ctro+C)

    Exception

    常规错误的基类

    StopIteration

    迭代器没有更多的值

    GeneratorExit

    生成器(generator)发生异常来通知退出

    StandardError

    所有的内建标准异常的基类

    ArithmeticError

    所有数值计算错误的基类

    FloatingPointError

    浮点计算错误

    OverflowError

    数值运算超出最大限制

    ZeroDivisionError

    除(或取模)零 (所有数据类型)

    AssertionError

    断言语句失败

    AttributeError

    对象没有这个属性

    EOFError

    没有内建输入,到达EOF 标记

    EnvironmentError

    操作系统错误的基类

    IOError

    输入/输出操作失败

    OSError

    操作系统错误

    WindowsError

    系统调用失败

    ImportError

    导入模块/对象失败

    LookupError

    无效数据查询的基类

    IndexError

    序列中没有此索引(index)

    KeyError

    映射中没有这个键

    MemoryError

    内存溢出错误(对于Python 解释器不致命)

    NameError

    未声明/初始化对象 (没有属性)

    UnboundLocalError

    访问未初始化的本地变量

    ReferenceError

    弱引用(Weak reference)试图访问已经垃圾回收了的对象

    RuntimeError

    一般的运行时错误

    NotImplementedError

    尚未实现的方法

    SyntaxError

    Python 语法错误

    IndentationError

    缩进错误

    TabError

    Tab 和空格混用

    SystemError

    一般的解释器系统错误

    TypeError

    对类型无效的操作

    ValueError

    传入无效的参数

    UnicodeError

    Unicode 相关的错误

    UnicodeDecodeError

    Unicode 解码时的错误

    UnicodeEncodeError

    Unicode 编码时错误

    UnicodeTranslateError

    Unicode 转换时错误

    Warning

    警告的基类

    DeprecationWarning

    关于被弃用的特征的警告

    FutureWarning

    关于构造将来语义会有改变的警告

    OverflowWarning

    旧的关于自动提升为长整型(long)的警告

    PendingDeprecationWarning

    关于特性将会被废弃的警告

    RuntimeWarning

    可疑的运行时行为(runtime behavior)的警告

    SyntaxWarning

    可疑的语法的警告

    UserWarning

    用户代码生成的警告

    FileNotFoundError

    未发现文件错误,要读的文件不存在

      在python2中,要读的文件不存在时,会报IOError异常;而在python3中,如果要读的文件不存在,则会报FileNotFoundError异常。

     

    异常处理

    try...except...

      1.try语句中捕获异常,在except语句中处理异常。当try所包含的语句中没有异常时,程序正常执行,except语句被忽略,不再执行;当try语句中捕获到了异常时,try语句从异常出现的位置都不再执行,而是执行except语句进行异常处理。

      2.except语句后面可以跟一个具体的异常类型,表示此条except语句专门用来处理此种类型的异常;也可以没有任何异常类型,表示此条except语句可以处理任何类型的异常。

      3.try后还可以有多个except语句,每个except语句都可以用来处理某一类的异常,当try捕获到了某个异常时,就会跳到相应的except语句中进行异常的处理。此外,还可以在一个except语句后面放多个异常参数,多个异常参数必须以元组的形式放入,表示这几个异常由某一个except语句作统一的处理。

      4.可以在except的异常参数后加上as语句,用来将系统提示的异常原因打印出来。

      5.如果except语句中对异常处理的要求不严格,不需要具体的处理某一类的异常,可以直接使用except或者except Exception, e或者except Exception as e来捕获所有类型的异常,因为as后的变量e指向了异常对象的引用。

      raise关键字用来抛出自定义的异常,即raise关键字后面可以跟自定义的异常。当只使用raise关键字时,而没有自定义异常,它会将当前位置发生的异常向上抛出,抛到上一级位置。同样的,如果没有raise,发生异常时,异常也会从当前位置一级一级地向上抛出,知道异常被捕获或者被系统处理。

    def test1():
        print('......1.....')
        print(num)    # 此处有异常,打印了一个未申明的变量
    
    def test2():
        print('......2.....')
        test1()    # test2函数里调用test1函数
    
    def test3():
        try:    # test3函数中有异常处理机制
            print('......3.....')
            test2()    # test3函数里调用test2函数
        except:
            print('there has a error.')
    
    test3()
    macdeMBP:~ mac$ python3 a.py    # 执行文件
    ......3.....
    ......2.....
    ......1.....
    there has a error.    # test3中作的异常处理

      以上代码中,当执行test3函数时,test3函数中调用了test2函数,test2函数中又调用了test1函数,test1函数发生异常,而test1函数中又没有异常处理机制,此时会将异常上抛给test2函数,test2函数中也没有异常处理机制,则会将异常继续上抛给test3函数,test3函数中会捕获异常并进行处理。若test3函数中也没有异常处理,则会继续上抛给python解析器,由python解析器进行处理并中断程序。

     else子句:

      在异常处理中,else子句是放在except子句之后。如果try语句中没有捕获到异常,即程序正常的执行完毕,except被忽略,此时else子句会执行;如果try语句中发生异常,except被执行,此时else子句不会被执行。简言之,发生了异常,else不执行;没有发生异常,else语句执行。

    finally子句:

      finally子句放在最后,不管前面执行了try还是except,最终都要执行finally子句,它可用来作最后的善后工作,比如可在finally中关闭文件等操作。

      异常处理的格式综合为:

        try:

          pass

        except:

          pass

        else:

          pass

        finally:

          pass

     

    用户自定义异常

      通过自定义一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的通过直接或间接的方式继承Exception类。以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。在try语句块中,用户自定义的异常后执行except块语句,变量 e 指向了Networkerror类的实例的引用

     

    class NetworkError(RuntimeError):    # 直接或间接的方式继承Exception类
        def __init__(self, arg):
            self.args = arg
    在定义以上类后,可以触发该异常,如下所示:
    try:
        raise NetworkError("Bad hostname")    # 抛出自定义的异常类,可在except中处理
    except NetworkError as e:    # 变量e指向了Networkerror异常类实例的引用
        print e.args    # 通过实例打印异常类中的属性

     

    assert

      Python的断言就是检测一个条件,如果条件为真,它什么都不做;反之它触发一个带可选错误信息的AssertionError。通常用来断言某个变量的值必然是什么,或者对象必然拥有某个属性。

      使用assert的最佳时机:

        防御性编程;

        运行时对程序逻辑的检测;

        合约性检查(比如前置条件、后置条件);

        程序中的常量;

        检查文档。

     

  • 相关阅读:
    百度面试题
    京东2014年招聘会成都站笔试经历
    把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间
    POJ 2234 Matches Game
    POJ 3903 Stock Exchange
    POJ 2853 Sequence Sum Possibilities
    POJ 3519 Minimal Backgammon
    POJ 2096 Collecting Bugs
    POJ 3071 Football
    HDU 1175 连连看
  • 原文地址:https://www.cnblogs.com/wgbo/p/9952078.html
Copyright © 2011-2022 走看看