错误和异常
什么是異常?
? ? ? ? 因為程序出現了錯誤而在正常流程控制以外采取的行動。這個行動分為兩個階段:首先是引起異常發生的錯誤;其次是檢測(和可能采取的措施)階段。
如:NameError
print ab那對于異常如何檢測和處理呢?
異常可以用 try 語句來檢測。任何在 try 語句塊中的代碼都會被監測,檢查有誤異常發生。
try 語句主要有兩種主要形式:try-except 和 try-finally ,這個兩個語句是互斥的,只能使用其中一個。一個 try 可以對應一個或者多個 except 子句,但是只能對應一個 finally 子句,或者是一個 try-except-finally符合語句
try:try_suite #監控這里的異常 except Exception[,reason]:except_suite #異常處理代碼 try:f = open('absd','r') except IOError,e:print "could not open file:",e當發生IOError異常時,這里打印出一條診斷消息,但程序仍然繼續執行。當程序運行時,解釋器嘗試執行 try 塊里面的代碼,如果代碼完成后,沒有異常發生,執行流會忽略 except 語句繼續執行,這里保存了異常的原因放置在e中。
也可以帶有多個except的try語句
try:try_suite #監控這里的異常 except Exception1[,reason1]:except_suite1 #異常處理代碼 except Exception2[,reason2]:except_suite2 #異常處理代碼這里頂一個以safe_float函數,float內建函數將把任意一個數值類型轉換成浮點型,同時也能把字符串表示的數值轉成浮點型,但對于其它類型就無能為力。
def safe_float(obj):try:retval = float(obj)except ValueError:retval = "could not convert non-number to float"except TypeError:retval = "object type can not be converted to float"return retvalprint safe_float('xyz') print safe_float(200L)此外對于處理多個異常的except語句,也可以在一個except子句中處理多個異常。except語句在處理多個異常時要求被放置在一個元組里面。
try:try_suite #監控這里的異常 except (Exception1[,Exception2[,...])[,reason1]:except_suite1 #異常處理代碼? ? ?異常被引發后,異常參數reason是作為附加幫助信息傳遞給異常處理器,將會是一個包含來自導致異常的代碼的診斷信息的類實例。
def safe_float(obj):try:retval = float(obj)except (ValueError,TypeError):retval = "argument must be a number or numertic string"return retvalprint safe_float('xyz') print safe_float(200L)由于多數內見異常是從StanardError派生的,和這個元組只包含了一個只是錯誤原因的字符串,而調用str(reason)可以得到一個可讀性較好的字符串,因此做如下修改。
def safe_float(obj):try:retval = float(obj)except (ValueError,TypeError),args:retval = str(args)return retvalprint safe_float('xyz') print safe_float([])這里給出一個讀取文件的針對異常處理的經典方式
try:try:cfile = open("test,txt",'r')tx = cfile.readlines()except IOError:log.write("no tx this month\n") finally:cfile.close()代碼片會嘗試打開并且讀取數據,如果在某一步發生了錯誤,會寫入到日志,隨后文件被正確關閉。此外還有一個with語句,該語句的目的雜魚從流程圖中把try,except,finally關鍵字和資源分配釋放相關代碼統統去掉。
with context_expr [as var]:with_suite注意with僅能鞏固支持上下文管理協議的對象,而file是可以,其他的這里先不介紹
with open("/etc/passwd",'r') as f:for eachline in f:pass如果一切正常,把文件對象賦值給f,然后是迭代器遍歷文件中的每一行,當完成時,關閉文件,無論在這一段代碼的開始,中間,還是結束時發生異常,會執行清理的代碼,此外文件仍會被自動關閉。總結
- 上一篇: 列表解析和生成器表达式
- 下一篇: Python之方法调用