异常
转载请注明出处:(http://blog.csdn.net/lis_12/article/details/52759848)
所有异常都是基类Exception的成员。所有异常都从基类Exception继承,而且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。一旦引发而且没有捕捉SystemExit异常,程序执行就会终止。如果交互式会话遇到一个未被捕捉的SystemExit异常,会话就会终止。
使用
raise
可引发异常,格式:raise Exception([value]),异常类型,指定异常细节的可选参数;
使用try和except可以捕捉异常,正常执行的语句放在try块中,错误处理语句放在except块中
格式:
try: fp = open(filename,'r') print 'try' except IOError,NameError as e:#except后面可以写多个异常,e存储的是异常信息 #如果except后面什么都不写就是捕捉所有异常,尽量避免捕捉所有异常,不然出错了不好找啊 print e print '%s do not exist'%filename else:#try中无异常才会执行else语句 print 'else' for i in fp: print i fp.close() finally:#无论如何都会执行,如果进入了try即使进入了return,也会执行finally处 print 'finally' assert 1==2 #如果该表达式为假 触发异常
常见异常类型
异常名称 | 解释 |
---|---|
AttributeError | 属性错误,特性引用和赋值失败时会引发属性错误 |
NameError | 试图访问的变量名不存在 |
SyntaxError | 语法错误,代码形式错误 |
Exception | 与退出程序相关异常之外的所有异常,尽量不要用这种异常,不然bug很不好找 |
IOError | 一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误 |
KeyError | 使用了映射中不存在的关键字(键)时引发的关键字错误 |
IndexError | 索引错误,使用的索引不存在,常索引超出序列范围 |
TypeError | 类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误 |
ZeroDivisonError | 除数为0,在用除法操作时,第二个参数为0时引发了该错误 |
ValueError | 值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数 |
StopIteration | 引发后可停止迭代 |
ImportError | import异常 |
定义新异常
所有内置异常都是使用类定义,创建一个新异常,就定义父类为Exception的新类.
- 定义
- 可通过raise触发异常,引发异常时,将利用raise传递异常的参数;
#定义新的异常
class NewException1(Exception):
def __init__(self,*arg):
self.args = arg
class NewException2(Exception):
def __init__(self,*arg):
self.a = arg
try:
raise NewException1(1,2,3,4)
except Exception as e:
print e #(1,2,3,4)
try:
raise NewException2(1,2,3,4)
except Exception as e:
print e#空
'''如果不定义self.args这个属性,打印异常信息时,看不到任何信息'''