異常是指程序中的例外,違例情況。異常機制是指程序出現錯誤后,程序的處理方法。當出現錯誤后,程序的執行流程發生改變,程序的控制權轉移到異常處理。
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語句檢測。