1. python中有很多中异常,比如使用没有申请的变量会为NameError,语法不对为SyntaxError,请求的索引超出序列范围为IndexError。
2. 异常处理:主要有两种形式try-except和try-finally,我们只能使用其中的一种,一个try语句可以对应一个或多个except子句,但只能对应一个finally子句或是一个try-except-finally复合语句。
Try-except-else:检测和处理异常,else子句处理没有探测到异常时执行的代码。
try-finally:检测并做一些必要的清除工作。
try-except-finally:上面两者都可以做到。
下面举个例子说明,我们写一个转换为整数的函数,如下:
def ConInt(obj):
try:
result=int(obj)
except ValueError:
result="could not convert"
except TypeError:
result='type is wrong'
return result
下面是函数调用:
>>> ConInt('asd')
'could not convert'
>>> ConInt([1,2])
'type is wrong'
我们也可以在一个except中处理多个异常,将异常写为元组的形式如下
def ConInt(obj):
try:
result=int(obj)
except (ValueError,TypeError):
result="could not convert"
return result
3. 异常参数,可以携带更详细的异常信息,该参数以元组的方式放在except后面,下面是例子。
>>> def ConInt(obj):
... try:
... result=int(obj)
... except (ValueError,TypeError),diag:
... result=str(diag)
... return result
...
>>> ConInt('asd')
"invalid literal for int() with base 10: 'asd'"
>>> ConInt([1,3])
"int() argument must be a string or a number, not 'list'"
4. With语句:只工作于支持上下文管理协议的对象。比如file对象就支持,那我们就可以使用wirh,如下:
With open(‘test.txt’,’r’) as f:
For eachLine in f:
# do something
该段代码会视图打开一个文件,然后遍历文件中的每一行,完成后关闭文件,使用with的好处是这段代码无论哪里发生了异常,都会执行清理的代码,文件会被自动关闭。和使用try-finally是一样的。
5. 触发异常
使用raise[SomeException[,args [,traceback]]]语句来触发异常。
参数SomeException为触发异常的名字,必须是字符串,类或实例。
参数args为可选,指示错误原因的元组。
参数traceback,可选,当异常触发时新生成一个用于异常-正常话的追踪对象,当你想重新引发异常时,该参数很有用,可以用来区别先前和当前的位置,如果没有写None。
6.可以通过sys模块中exc_info函数来获取异常信息,如下:
>>> try:
... int('asdf')
... except:
... import sys
... exc_tuple=sys.exc_info()
...
>>> print exc_tuple
(<type 'exceptions.ValueError'>, ValueError("invalid literal for int() with base 10: 'asdf'",), <traceback object at 0x0164B6E8>)
>>> for item in exc_tuple:
... print item
...
<type 'exceptions.ValueError'>
invalid literal for int() with base 10: 'asdf'
<traceback object at 0x0164B6E8>
从后面的for中我们可以看出得到的异常元组包括三项信息,分别表示异常类,异常类的实例和追踪对象。
7. 下图为python异常的继承体系结构: