异常简介
先回答几个问题:
为什么要需要异常?
答:防止程序出现错误而终止。
(1)比如你打开了一个数据库连接,执行SQL语句的时候,语句有问题,如果不去捕获SQL异常,程序会到此处中断。意味着假设你后面写了关闭数据库连接操作,它不会被执行;
(2)ok,还有一个原因,假设你不使用异常,那么你为了防止程序可能发生错误崩掉,得想尽一切办法去显式考虑这些情况。比如为了不使用IO异常,你可能要穷举一切可能引发IO错误的因素,比如文件不存在、对文件没有访问权限、文件正在被别的程序占用等等。一方面在实现这些可能的时候不一定都很容易,另一方面要穷举无限可能实在是令人头疼!异常的描述
答:异常是程序出现了错误而在正常控制流之外采取的行为。在python中,所有的错误都符合相似的格式。所有的错误,无论是语法上的还是逻辑上的,都是由于和python解释器不相容导致的,其后果就是引发异常。
Python中的异常
Python中try语句有三种形式:try-except
、try-finally
、try-except-finally
。except
后面可以跟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)
有些异常不是由于错误条件引起的. 它们是 SystemExit
和KeyboardInterupt
. 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
我们看异常的继承图:
(KeyboardInterupt
, SystemExit
和Exception
是平级,图上有些出入)
所以我们可以这么写来捕获全部异常:
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核心编程》