python学习笔记——异常处理

异常处理

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

try:
    try-block
except Exception1:
    handler1
except Exception2:
    handler2
...
except:
    handler
else:
    else-block
finally:
    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 try
inter try
unsupported operand type(s) for +: 'int' and 'list'
inner finally
outer 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 * x
test(-1)     # AssertionError: x must be great zerot

常见异常

type说明
NameError通常出现在访问一个未声明变量时
SyntaxError这个最常见,语法错误
IndexError索引越界错误
IOErrorIO(输入/输出) 错误 通常出现在 打开或者对一个不存在的文件进行操作时
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),触发此异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值