python学习笔记——异常处理

来源:互联网 发布:人工智能权威期刊 编辑:程序博客网 时间:2024/05/01 21:05

异常处理

try/多个except/else/finally语句
try代码块是此语句的主要动作,尝试执行的代码。except分句捕获且处理try代码块内引发的异常,else分句是try没有发生异常时要执行的处理器。finally语句不管异常是否发生都会去执行的,如果没有异常发生,执行完try代码块后执行finally语句,否则执行完异常处理之后跳去执行finally语句。

try:    try-blockexcept Exception1:    handler1except Exception2:    handler2...except:    handlerelse:    else-blockfinally:    finally-block# 一般常用形式try...except...finally # 注意:finally一但有异常发生,就会触发finally语句执行,小心谨慎使用。一般在最外层使用,用于程序异常结束关闭文件,数据库连接,套接字连接等。try:    print 'outer try'    try:        print 'inner try'        temp = 1 + []    # unsupported operand type(s) for +: 'int' and 'list'    except TypeError as e:        print e    finally:        print 'inner finally'finally:    print 'outer finally'# 输出:'''outer tryinter tryunsupported operand type(s) for +: 'int' and 'list'inner finallyouter finally'''
  1. 如果try代码块执行时发生了异常,python会去执行第一个符合引发异常的except分句下面的处理代码。如果没有找到符合的except分句,异常就会传递到当前try语句外部,由外部的except处理。当except语句执行完后,假设except语句执行过程中无异常发生,控制权就会跳到try语句后继续执行。如果有finally语句自动触发执行。
  2. 如果try代码块执行无异常发生,python会去执行else分句代码块,执行完后控制权会跳到try语句后继续执行。
  3. 使用except可以捕获所有异常,如异常嵌套结构中高层try处理器所期待发生的异常错误,这类错误包括内存错误,循环迭代结束等。
  4. 利用sys.exc_info可以获取最近发生的异常的结果,以三元组的形式返回(type,value,traceback)。type是正在处理的异常的异常类型,value是异常参数,traceback是一个traceback对象,代表异常最初发生时所调用的堆栈。
  5. except常用形式
分句形式 说明 except: 捕捉所有(其他)异常类型 except name: 只捕捉特定的异常 except name,value: 捕获特定异常和其额外数据 except (name1,name2): 捕捉任何列出的异常 except (name1,name2),value: 捕捉任何列出的异常,并取得其额外数据 else: 如果没有引发异常,就运行 finally: 总是会运行此代码块,无论是否发生异常 except: 用在想不到异常情况,在except:前面可以定义可以想到的异常:except name1: except name2:

触发异常

有时候我们需要在自己实现的接口里抛出异常,这时候我们就要用到raise关键字了,后面跟着要引发的异常类名称,以及一个可选的额外数据项。异常不总是错误,但错误一定是异常。我们有时候需要在无法返回警示值的函数中主动抛出非错误异常。

class UndefineError(Exception):    def __init__(self, data)        self.data = data    def __str__(self):# 重载        return "UndefineError: can't find the item."def get_item():       # 获取一个数据库条目    if success:       # 成功找到,返回条目        return item    else:             # 查找失败,抛出自定义异常        raise UndefineError()# 最常用抛出异常方式     raise class_instance    # raise UndefineError('data')

class_instance异常类名称需要预先定义好,否则会报未定义错误。
我们可以在抛出异常的时候携带数据信息,在try语句中,捕获这个数据是通过一个变量实现的except class_instance, e,数据就存放在e变量中。

assert可以有条件地在程序代码中触发异常,可以认为是有条件的raise。assert几乎都是用来检验用户定义的约束条件,一般是用于检查接口参数合法性,通常没有必要写assert去捕捉超出索引值,类型不匹配以及除数为0之类的事。

assert <conditon_test> <tip_data>def test(x):    assert x > 0, 'x must great than zero.'    return x * xtest(-1)     # AssertionError: x must be great zerot

常见异常

type 说明 NameError 通常出现在访问一个未声明变量时 SyntaxError 这个最常见,语法错误 IndexError 索引越界错误 IOError IO(输入/输出) 错误 通常出现在 打开或者对一个不存在的文件进行操作时 KeyError 请求一个不存在的字典键值 AttributeError 尝试访问函数或者类的未知对象属性时会出现此类错误 TypeError 类型错误 OverflowError 内存溢出 ImportError 当import语句无法找到对应的模块定义或from…import无法找到对应名字的内容时触发此异常 EOFError 当内建函数(input() 或 raw_input())达到文件尾时触发此异常 AssertionError 当判定条件失败时,触发此异常 EnvironmentError 所有能发生在Python系统之外的异常的基类:IOError, OSError ArithmeticError 一些内建算术错误异常的基类,如:OverflowError, ZeroDivisionError,FloatingPointError StandardError 所有内建异常的基础类,除了StopIteration,GeneratorExit, KeyboardInterrupt和SystemExit。StandardError 是继承Exception而来的 RuntimeError 当一个无法分类的错误发生时,触发该异常 SystemError 当解释程序遇到一个内部错误,但是情况看来可以纠正,不需要放弃退出 SystemExit 这个异常被 sys.exit() 函数触发。当这个异常没有被有效处理,Python终止程序并退出;没有堆栈信息打印。如果辅助参数是整数,它表示系统退出状态(和C语言的exit()函数类似);如果它是空则退出状态为0;如果它是其它类型(例如字符串),这个对象会被打印输出,并且退出状态为1 ValueError 当一个内建操作或函数接收了参数,参数的类型是对的但值并不符合并且无法匹配一个更加精准的异常(例如:IndexError),触发此异常
0 0