Python异常处理

异常简介

先回答几个问题:

  1. 为什么要需要异常
    答:防止程序出现错误而终止。
    (1)比如你打开了一个数据库连接,执行SQL语句的时候,语句有问题,如果不去捕获SQL异常,程序会到此处中断。意味着假设你后面写了关闭数据库连接操作,它不会被执行;
    (2)ok,还有一个原因,假设你不使用异常,那么你为了防止程序可能发生错误崩掉,得想尽一切办法去显式考虑这些情况。比如为了不使用IO异常,你可能要穷举一切可能引发IO错误的因素,比如文件不存在、对文件没有访问权限、文件正在被别的程序占用等等。一方面在实现这些可能的时候不一定都很容易,另一方面要穷举无限可能实在是令人头疼!

  2. 异常的描述
    答:异常是程序出现了错误而在正常控制流之外采取的行为。在python中,所有的错误都符合相似的格式。所有的错误,无论是语法上的还是逻辑上的,都是由于和python解释器不相容导致的,其后果就是引发异常。

Python中的异常

Python中try语句有三种形式:try-excepttry-finallytry-except-finallyexcept后面可以跟else语句

异常处理机制

如果没有找到合适的处理器(except子句里面的内容), 那么异常就向上移交给调用者去处理, 这意味着堆栈框架立即回到之前的那个. 如果在上层调用者也没找到对应处理器, 该异常会继续被向上移交, 直到找到合适处理器. 如果到达最顶层仍然没有找到对应处理器, 那么就认为这个异常是未处理的, Python 解释器会显示出跟踪返回消息, 然后退出。


处理单个异常

def test_exc():
    try:
        fileobj = open(r'C://wangjiang.txt', 'r')
    except IOError, e:
        print e


处理多个异常

def test():
    try:
        fileobj = open(r'C://wangjiang.txt', 'r')
    except (IOError,TypeError), e:
        print e


捕获所有异常(1)

def test():
    try:
        fileobj = open(r'C://wangjiang.txt', 'r')
    except Exception, e:  # Exception是最顶层的异常
        print e


捕获所有异常(2)
有些异常不是由于错误条件引起的. 它们是 SystemExitKeyboardInterupt . SystemExit 是由于当前 Python 应用程序需要退出,KeyboardInterupt 代表用户按下了 CTRL-C (^C) , 想要关闭 Python 。我们可以这么做

try:
    ...
except (KeyboardInterupt, SystemExit):
    # user wants to quit
    raise # reraise back to caller
except Exception:
    # handle real errors

我们看异常的继承图:
Exception
KeyboardInterupt, SystemExitException是平级,图上有些出入)

所以我们可以这么写来捕获全部异常:

try:
    ...
except BaseException, e:
    # handle all errors

异常参数

注意上面所有代码except那行最后的e,异常引发后,关于异常的信息会保存到它里面。e其实是一个异常类的实例。我们print e的时候其实是调用这个对象的__str__()方法。

else子句

在 else 范围中的任何代码运行前,try 范围中的所有代码必须完全成功(也就是,结束前没有引发异常)。

raise子句

程序员在编写API时也希望在遇到错误的输入时(比如类型错误)触发异常,我们可以使用raise语句。

code example

try:
    raise TypeError('Input type is wrong!')
except Exception, e:
    print 'Error: ', e

标准异常集

额
饿

获取异常信息的另一种方式

上面我们可以通过except XXError, e这种方式获得异常类的实例,使用这个实例的方法来获取异常信息。下面我们将通过另一种方式:

sys模块中的exc_info()函数返回一个三元组,分别表示:异常类、异常类的实例、追踪对象。

code example

>>> import sys
>>> try:
        float('abc')
    except:
        exc_tuple = sys.exc_info()

>>> print exc_tuple
(<type 'exceptions.ValueError'>, ValueError('could not convert string to float: abc',), <traceback object at 0x029E4CB0>)


参考自:《Python核心编程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值