異常是指程序中的例外,違例狀況。異常機制是指程序出現錯誤後,程序的處理方法。當出現錯誤後,程序的執行流程發生改變,程序的控制權轉移到異常處理。
Exception類是經常使用的異常類,該類包括StandardError,StopIteration, GeneratorExit, Warning等異常類。
StandardError類是python中的錯誤異常,若是程序上出現邏輯錯誤, 將引起該異常。StandardError類是全部內斂異常的基類,放置在默認的命名空間中,所以使用IOEroor,
EOFError, ImportError等類,不須要導入exception模塊。
StopIteration類判斷循環是否執行到尾部,若是循環到尾部,則拋出該異常。
GeneratorExit類是由Generator函數引起的異常,當調用close()時引起該異常。
Warning類表示程序中的代碼引發的警告。
python中的異常使用繼承結構建立,能夠在異常處理程序中捕獲基類異常,也能夠捕獲各類子類異常,python中使用try...except語句捕獲異常,異常子句定義在try子句後面。
try...except的使用方法
try...except用於處理問題語句,捕獲可能出現的異常。try子句中的代碼塊放置可能出現異常的語句,except子句中的代碼塊處理異常。
演示try...except語句捕獲IOError異常
try: file("hello.txt", "r") #若是文件不存在,引起異常 print "讀文件" except IOError: #捕獲IO異常 print "文件不存在" except: #其它異常 print "程序異常"
python與Java的異常處理模式類似,異常處理語句也能夠嵌套,演示以下:
try: s = "hello" try: print s[0] + s[1] print s[0] - s[1] except TypeError: print "字符串不支持減法運算" except: print "異常"
若是外層try子句中的代碼引起異常,程序將直接跳轉到外層try對應的except子句,而內部的try子句將不會被執行。
try...finally的使用方法
try...except後還能夠添加一個finally子句。不管異常是否發生,finally子句都會被執行。全部的finally子句一般用於關閉因異常而不能釋放的系統資源。
try: f = open("hello.txt", "r") try: print f.read(5) except: print "讀文件異常" finally: print "釋放資源" f.close() except IOError: print "文件不存在"
使用raise拋出異常
當程序出現錯誤,python會自動引起異常,也能夠經過raise顯示地引起異常。一旦執行了raise語句,raise後面的語句將不能執行。
演示raise用法
try: s = None if s is None: print "s 是空對象" raise NameError #若是引起NameError異常,後面的代碼將不能執行 print len(s) except TypeError: print "空對象沒有長度"
自定義異常
python容許程序員自定義異常,用於描述python中沒有涉及的異常狀況,自定義異常必須繼承Exception類,自定義異常按照命名規範以"Error"結尾,顯示地告訴程序員這是異常。自定義異常使用raise語句引起,並且只能經過人工方式觸發。
from __future__ import division class DivisionException(Exception): def __init__(self, x, y): Exception.__init__ (self, x, y) #調用基類的__init__進行初始化 self.x = x self.y = y if __name__ == "__main__": try: x = 3 y = 2 if x % y > 0: #若是大於0, 則不能被初始化,拋出異常 print x/y raise DivisionException(x, y) except DivisionException,div: #div 表示DivisionException的實例對象 print "DivisionExcetion: x/y = %.2f" % (div.x/div.y)
assert語句的使用
assert語句用於檢測某個條件表達式是否爲真。assert語句又稱爲斷言語句,即assert認
爲檢測的表達式永遠爲真,if語句中的條件判斷均可以使用assert語句檢測。