1. 拋出異常和自定義異常
Python用異常對象(exception object)表示異常情況,遇到錯誤后,會引發異常。如果異常對象並未被處理或捕捉,程序就會用所謂的回溯(Traceback,一種錯誤信息)終止執行。
1.1 raise 語句
Python中的raise 關鍵字用於引發一個異常,基本上和C#和Java中的throw關鍵字相同,如下所示:
1 # -- coding: utf-8 -- 2 3 def ThorwErr(): 4 raise Exception("拋出一個異常") 5 6 # Exception: 拋出一個異常 7 ThorwErr()
raise
關鍵字后面是拋出是一個通用的異常類型(Exception),一般來說拋出的異常越詳細越好,Python在exceptions
模塊內建了很多的異常類型,通過使用dir
函數來查看exceptions
中的異常類型,如下:
import exceptions # ['ArithmeticError', 'AssertionError'.....] print dir(exceptions)
傳遞異常
捕捉到了異常,但是又想重新引發它(傳遞異常),可以使用不帶參數的raise
語句即可:
1 # -- coding: utf-8 -- 2 class MuffledCalculator: 3 muffled = False 4 def calc(self,expr): 5 try: 6 return eval(expr) 7 except ZeroDivisionError: 8 if self.muffled: 9 print 'Division by zero is illegal' 10 else: 11 raise
1.2 自定義異常類型
Python中也可以自定義自己的特殊類型的異常,只需要要從Exception類繼承(直接或間接)即可:
class SomeCustomException(Exception): pass
2. 捕捉異常
和C#中的try/catch
類似,Python中使用try/except
關鍵字來捕捉異常,如下:
# -- coding: utf-8 -- try: print 2/0 except ZeroDivisionError: print '除數不能為0'
2.1 捕捉多個異常
在一個except語句只捕捉其后聲明的異常類型,如果可能會拋出的是其他類型的異常就需要再增加一個except語句了,或者也可以指定一個更通用的異常類型比如:Exception
,如下:
# -- coding: utf-8 -- try: print 2/'0' except ZeroDivisionError: print '除數不能為0' except Exception: print '其他類型異常'
為了捕獲多個異常,除了聲明多個except語句之外,還可以在一個except語句之后將多個異常作為元組列出來即可:
# -- coding: utf-8 -- try: print 2/'0' except (ZeroDivisionError,Exception): print '發生了一個異常'
2.2獲取異常信息
每個異常都會有一些異常信息,一般情況下我們應該把這些異常信息記錄下來:
# -- coding: utf-8 -- try: print 2/'0' except (ZeroDivisionError,Exception) as e: # unsupported operand type(s) for /: 'int' and 'str' print e
3. finally子句
finally
子句和try
子句聯合使用但是和except語句不同,finally
不管try
子句內部是否有異常發生,都會執行finally
子句內的代碼。所有一般情況下,finally
自己常常用於關閉文件或者在Socket中。
# -- coding: utf-8 -- try: print 2/'0' except (ZeroDivisionError,Exception): print '發生了一個異常' finally: print '不管是否發生異常都執行'