def division(a, b):
try:
print'res = %s' % (a / b)
except (ZeroDivisionError, ArithmeticError) as e:
return str(e) # 注意此处使用的是return
else:
print '%s / %s = %s' % (a, b, a / b)
finally:
print 'finally clause'
分别输入参数(1, 2),(1, 0)和 (1,“0”)执行:
print 'return value: %s' % division(a, b)
得到的结果如下:
res = 0
/ 2 = 0
finally clause
return value: None
finally clause
return value: integer division or modulo by zero
finally clause
Traceback (most recent call last):
File "D:\My Folders\Cnblogs\Alpha Panda\Main.py", line 217, in <module>
print 'return value: %s' % division(1, "0")
File "D:\My Folders\Cnblogs\Alpha Panda\Main.py", line 208, in division
print'res = %s' % (a / b)
TypeError: unsupported operand type(s) for /: 'int' and 'str'
可以看到纵使程序发生异常且没有被正确处理,在程序终止前,finally语句依旧被执行了。可以将此看做程序安全的最后一道有效屏障。主要进行一些善后清理工作,比如资源释放、断开网络连接等。当然with声明可以自动帮我们进行一些清理工作。
2.6 raise抛出异常程序执行过程中可以使用raise主动的抛出异常.
try: e = Exception('Hello', 'World') e.message = 'Ni Hao!' raise e except Exception as inst: print type(inst), inst, inst.args, inst.message
结果:<type 'exceptions.Exception'> ('Hello', 'World') ('Hello', 'World') Ni Hao!
上面展示了except对象的属性args, message。
2.7 自定义异常绝大部分情况下内置类型的异常已经能够满足平时的开发使用,如果想要自定义异常类型,可以直接继承内置类型来实现。