NameError 尝试访问一个未申明的变量
ZeroDivisionError 除数为零
SyntaxError 解释器语法错误
IndexError 请求的索引超出序列范围
KeyError 请求一个不存在的字典关键字
IOError 输入/输出错误
AttributeError 尝试访问未知的对象属性
异常可以通过try语句来检测。任何在try语句块里的代码都会被监测,检查有无异常发生。
try语句有两种主要形式:try-except和try-finally。这两个语句是互斥的,也就是说你只能使用其中的一种。一个try语句可以对应一个或多个except子句,但只能对应一个finally子句,或是一个try-except-finally复合语句。
你可以使用try-except语句检测和处理异常。你也可以添加一个可选的else子句处理没有探测到异常的执行的代码。而try-finally只允许检测异常并做一些必要的清除工作,没有任何异常处理设施。
try:
try_suite
except Exception[,reason]:
except_suite
try语句块中异常发生点后的剩余语句永远不会到达,所以也永远不会执行。处理流程:忽略代码,继续执行和向上移交。
可以把多个except语句连接在一起,处理一个try块中可能发生的多种异常。
try:
try_suite
except Exception1[,reason]:
except_suite1
except Exception2[,reason]:
except_suite2
也可以在一个except子句里处理多个异常。except语句在处理多个异常时要求异常被放在一个元组里:
try:
try_suite
except (Exception1,Exception2)[,reason]:
except_suite1_and_suite2
如果要捕获所有的异常呢?
第一种:Exception是在最顶层的。
try:
:
except Exception,e:
#error occurred,log 'e',etc.
第二种:不推荐
try:
:
except:
#error occurred,etc.
BaseException下面分别有三大类异常:KeyboardInterrupt、SystemExit和Exception。所有当前内建异常都放在Exception下。
底线:避免把大片的代码装入try-except中然后使用pass忽略掉错误。
一般来说,异常的名字已经是一个满意的线索了,但这个错误字符串会提供更多的信息。
__class__属性存在于所有的类实例中,而__doc__类属性存在于所有的定义了文档字符串的类中。
采用字符串化的异常参数来替换单一的错误信息:
def safe_float(object):
try:
retval=float(object)
except (ValueError,TypeError),diag:
retval=str(diag)
return retval
在try范围中没有异常被检测到时,执行else子句。
finally子句是无论异常是否发生,是否捕捉都会执行的一段代码。
try:
A
except MyException:
B
else:
C
finally:
D
无论如何,你都可以有不止一个的except子句,但最少有一个except语句,而else和finally都是可选的。
另一种finally的使用方式是finally单独和try连用。
如果finally中的代码引发了另一个异常或由于return、break、continue语法而终止,原来的异常将丢失而且无法重新引发。
with语句是用来简化代码的。
try-except和try-finally的一种特定的配合用法是保证共享的资源的唯一分配,并在任务结束的时候释放它。
with语句的目的在于从流程图把try、except和finally关键字和资源分配释放相关代码统统去掉,而不像try-except-finally那样仅仅简化代码使之易用。
with context_expr [as var]:
with_suite
上下文管理器主要作用于共享资源。
python提供了一种机制让程序员明确的触发异常,这就是raise语句。
不含参数的raise语句结构会引发当前代码块最近触发的一个异常。如果之前没有异常触发,会因为没可以有重新触发额异常而生成一个TypeError异常。
断言是一句必须等价于布尔真的判定,发生异常也就意味着表达式为假。
断言可以简简单单的想象为raise-if语句。测试一个表达式,如果返回值为假,就触发异常。
assert expression[,arguments]
另一种获取异常信息的途径是通过sys模块中exc_info()函数。
#通过引发的异常信息,能够快速定位到问题并调试,找出处理错误的办法。
try:
filename=raw_input('Enter file name:')
fobj=open(filename,'r')
for eachLine in fobj:
print eachLine,
fobj.close()
except IOError,e:
print'file open error:',e
也可以通过raise语句故意引发一个异常。