本文較為詳細(xì)的羅列了Python常見(jiàn)的異常處理,供大家參考,具體如下:
1. 拋出異常和自定義異常
Python用異常對(duì)象(exception object)表示異常情況,遇到錯(cuò)誤后,會(huì)引發(fā)異常。如果異常對(duì)象并未被處理或捕捉,程序就會(huì)用所謂的回溯(Traceback,一種錯(cuò)誤信息)終止執(zhí)行。
①.raise 語(yǔ)句
Python中的raise 關(guān)鍵字用于引發(fā)一個(gè)異常,基本上和C#和Java中的throw關(guān)鍵字相同,如下所示:
# -- coding: utf-8 --
def ThorwErr():
raise Exception("拋出一個(gè)異常")
# Exception: 拋出一個(gè)異常
ThorwErr()
raise關(guān)鍵字后面是拋出是一個(gè)通用的異常類(lèi)型(Exception),一般來(lái)說(shuō)拋出的異常越詳細(xì)越好,Python在exceptions模塊內(nèi)建了很多的異常類(lèi)型,通過(guò)使用dir函數(shù)來(lái)查看exceptions中的異常類(lèi)型,如下:
import exceptions
# ['ArithmeticError', 'AssertionError'.....]
print dir(exceptions)
傳遞異常
捕捉到了異常,但是又想重新引發(fā)它(傳遞異常),可以使用不帶參數(shù)的raise語(yǔ)句即可:
# -- coding: utf-8 --
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
②.自定義異常類(lèi)型
Python中也可以自定義自己的特殊類(lèi)型的異常,只需要要從Exception類(lèi)繼承(直接或間接)即可:
class SomeCustomException(Exception):
pass
2. 捕捉異常
和C#中的try/catch類(lèi)似,Python中使用try/except關(guān)鍵字來(lái)捕捉異常,如下:
# -- coding: utf-8 --
try:
print 2/0
except ZeroDivisionError:
print '除數(shù)不能為0'
①.捕捉多個(gè)異常
在一個(gè)except語(yǔ)句只捕捉其后聲明的異常類(lèi)型,如果可能會(huì)拋出的是其他類(lèi)型的異常就需要再增加一個(gè)except語(yǔ)句了,或者也可以指定一個(gè)更通用的異常類(lèi)型比如:Exception,如下:
# -- coding: utf-8 --
try:
print 2/'0'
except ZeroDivisionError:
print '除數(shù)不能為0'
except Exception:
print '其他類(lèi)型異常'
為了捕獲多個(gè)異常,除了聲明多個(gè)except語(yǔ)句之外,還可以在一個(gè)except語(yǔ)句之后將多個(gè)異常作為元組列出來(lái)即可:
# -- coding: utf-8 --
try:
print 2/'0'
except (ZeroDivisionError,Exception):
print '發(fā)生了一個(gè)異常'
②.獲取異常信息
每個(gè)異常都會(huì)有一些異常信息,一般情況下我們應(yīng)該把這些異常信息記錄下來(lái):
# -- 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子句聯(lián)合使用但是和except語(yǔ)句不同,finally不管try子句內(nèi)部是否有異常發(fā)生,都會(huì)執(zhí)行finally子句內(nèi)的代碼。所有一般情況下,finally自己常常用于關(guān)閉文件或者在Socket中。
# -- coding: utf-8 --
try:
print 2/'0'
except (ZeroDivisionError,Exception):
print '發(fā)生了一個(gè)異常'
finally:
print '不管是否發(fā)生異常都執(zhí)行'
更多建議: