异常

2018-11-13 07:33:50来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

异常类型

 

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的最佳时机:

    防御性编程;

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

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

    程序中的常量;

    检查文档。

 

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:python特性--property

下一篇:100G套图我用pythono爬虫双手奉上,给方法给资源你对哪个心动?