捕捉异常可以使用 try/except...else...finally 语句。
1、try原理及示例说明
try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
- 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
- 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
- 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
下面来看几个例子:
示例1:
# -*- coding: utf-8 -*-
if __name__ == '__main__':
for error_key in (0, 1):
print '======= {} ======='.format(error_key)
try:
print 'start'
if error_key:
raise ValueError('key error') # 抛出 ValueError 异常
except Exception, e:
print 'catch: ', e # e 存储异常信息
else:
print 'succ' # try中代码无异常时执行
finally:
print 'end\n' # 无论如何都执行
输出结果:
注意:else 必须放在 finally 前面。但是这两个可以都没有。
示例2:
# -*- coding: utf-8 -*-
if __name__ == '__main__':
try:
print 'start'
except (ImportError, AttributeError, ImportError), e:
print u'多个异常做同样处理时'
except:
raise IOError # 其他所有异常都在此捕获,继续向上层级抛出
自定义异常
# -*- coding: utf-8 -*-
class MyException(BaseException):
def __init__(self, *args, **kwargs):
print 'welcome my Exception'
if __name__ == '__main__':
try:
raise MyException
except:
print 'catch'
输出:
通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类(或者BaseException类)通过直接或间接的方式。当然你不继承也不会报错,但是会缺失一些方法。具体可查看源码。