Python-異常捕捉

為什么要使用異常捕捉

在運行程序的某一個功能時,可能會出現這樣的錯誤或者那樣的錯誤,有時一個功能可能是由多個模塊組合而成的,這樣排錯就無法追蹤是哪個環節出了問題,這時候就需要一個異常處理器來捕獲這些異常。

異常處理的常見場景

錯誤處理

一般程序遇到異常時會自動退出程序并拋出異常,在使用try語句來檢測錯誤時,遇到錯誤則會跳轉到try處理器,程序會在try之后重新執行。

特殊情況處理

有時候,為了處理一些不常見的異常情況,就需要用到異常處理器,避免編寫應對特殊情況的代碼。

終止行為

try/finally語句確保一定會進行需要的結束運算,無論程序是否有異常都將會執行finally語句下的代碼。

例子

def foo(a,b):

? ? a/b

>>> foo(10,0)

當b(除數)等于0的時候就會觸發異常便會觸發默認的異常管理器并拋出異常,打印標準出錯信息立即終止程序

捕獲異常

當運行一個小的腳本時遇到異常啟動默認管理器拋出異常并程序終止是可行的,在有些情況這并不是我們想要的,例如服務器程序在內部某個地方發生錯誤需要依然保持工作,則需要把相關代碼裝在try語句內捕捉異常。

def foo(a,b):

? ? try:

? ? ? ? a/b

? ?except:

? ?print('程序出現異常')

上面的except子句沒有接任何異常和參數,所有無論try捕獲了任何異常都將會交給except子句來處理無法定位具體異常,這樣和默認異常管理相比就是不會中斷程序。

def foo(a,b):

try:

a/b

except ZeroDivisionError:

print('除數不能為0')

print('continuing')

>>>foo(1,0)

除數不能為0

continuing

上面的例子中,except子句后接了具體異常,只處理除0的異常,所以當b等于0時,才會啟動try管理器執行后續代碼并且能看到最后輸出continuing。其他異常則想上層冒泡并執行默認異常管理器,程序中斷,標準輸出錯誤信息。

try:

num = int(raw_input("輸入一個整數:"))

print(100/num)

except ZeroDivisionError:

print("Error:必須大于等于1!")

except ValueError:

print("Error:必須輸入整數!")

try語句也可以捕獲多個異常,上面的例子中既捕獲了除0的錯誤同時也捕獲了ValueError 錯誤。

def foo(a,b):

try:

a/b

except ZeroDivisionError,e:

print('除數不能為0')

>>> e

>>> integer division or modulo by zero

看到上面的例子你可能會問這個e是個什么鬼,這個e其實是一個異常類的實例,是代碼更加詳細的錯誤信息。

def foo():

try:

f = open('test.txt'

except IOError,e:

print('錯誤信息:%s'%e)

else:

print('無錯誤')

>>>f.close()

try的else語句和其他條件語句類似,看了例子應該就會明白了。

def foo():

try:

f = open('test.txt')

except IOError,e:

print('錯誤信息:%s'%e)

else:

print('無錯誤')

finally:

f.close()

在有些情況下有些操作無論你前面的代碼是否執行成功都需要執行的情況下,finally子句就用的上了例如上面例子中無論文件test.txt操作是否成功都需要關閉文件。 總結下Python的完整異常語句,需要針對不同的業務場景靈活使用。

try:

try_suite

except Exception1,Exception2,...,Argument:

exception_suite

......? #other exception block

else:

no_exceptions_detected_suite

finally:

always_execute_suite

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容