- 按自己的方式出错
使用raise语句引发一个异常,可以使用一个类(应该是Exception的子类)或者实例参数来作为raise的引发对象。使用类时,程序会自动创建实例,如
>>> raise Exception('hyperdrive overload')
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
raise Exception('hyperdrive overload')
Exception: hyperdrive overload
- 捕捉异常
可以使用try/except实现捕捉异常,如
try: x = input(":") y = input(":") print x/y except ZeroDivisionError: print "hello exception" #结果如下: >>> :10 :2 5 >>> :1 :0 hello exception
再次引发异常,如
class MuffledCalculator: muffled = False def calc(self, expr): try: return eval(expr) except ZeroDivisionError: if self.muffled : #如果屏蔽标志开启,则处理异常 print "Division by zero is illegal" else:#如果屏蔽标志未开启,则再次引发异常 raise #结果如下: >>> clc = MuffledCalculator() >>> clc.calc('10/2') 5 >>> clc.calc('10/0') #没有屏蔽 Traceback (most recent call last): File "<pyshell#17>", line 1, in <module> clc.calc('10/0') #没有屏蔽 File "E:workCodepython est.py", line 137, in calc return eval(expr) File "<string>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero >>> clc.muffled = True >>> clc.calc('10/0') #有屏蔽 Division by zero is illegal
except后面不带参数可以捕捉所有的异常, 可以通过在ty/except后加一个except语句或者在except语句中用元组将多个异常类型列出来实现捕捉多个异常,如下:
try: x = input(":") y = input(":") print x/y except (ZeroDivisionError, TypeError), e: print e #结果如下 >>> :10 :0 integer division or modulo by zero
在ty/except后加一个else语句可以在没有引发异常的情况下执行一些语句,如
while True: try: x = input(":") y = input(":") print x/y except Exception,e: print e else : print "Ah,.... it successed" break #结果 >>> :10 :0 integer division or modulo by zero :10 :2 5 Ah,.... it successed
finally子句 -- finally子句肯定会被执行,不管try子句中是否发生异常,主要用于关闭文件或者网络套接字。