错误和异常
什么是異常?
? ? ? ? 因為程序出現(xiàn)了錯誤而在正常流程控制以外采取的行動。這個行動分為兩個階段:首先是引起異常發(fā)生的錯誤;其次是檢測(和可能采取的措施)階段。
如:NameError
print ab那對于異常如何檢測和處理呢?
異常可以用 try 語句來檢測。任何在 try 語句塊中的代碼都會被監(jiān)測,檢查有誤異常發(fā)生。
try 語句主要有兩種主要形式:try-except 和 try-finally ,這個兩個語句是互斥的,只能使用其中一個。一個 try 可以對應一個或者多個 except 子句,但是只能對應一個 finally 子句,或者是一個 try-except-finally符合語句
try:try_suite #監(jiān)控這里的異常 except Exception[,reason]:except_suite #異常處理代碼 try:f = open('absd','r') except IOError,e:print "could not open file:",e當發(fā)生IOError異常時,這里打印出一條診斷消息,但程序仍然繼續(xù)執(zhí)行。當程序運行時,解釋器嘗試執(zhí)行 try 塊里面的代碼,如果代碼完成后,沒有異常發(fā)生,執(zhí)行流會忽略 except 語句繼續(xù)執(zhí)行,這里保存了異常的原因放置在e中。
也可以帶有多個except的try語句
try:try_suite #監(jiān)控這里的異常 except Exception1[,reason1]:except_suite1 #異常處理代碼 except Exception2[,reason2]:except_suite2 #異常處理代碼這里頂一個以safe_float函數(shù),float內(nèi)建函數(shù)將把任意一個數(shù)值類型轉(zhuǎn)換成浮點型,同時也能把字符串表示的數(shù)值轉(zhuǎn)成浮點型,但對于其它類型就無能為力。
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 #監(jiān)控這里的異常 except (Exception1[,Exception2[,...])[,reason1]:except_suite1 #異常處理代碼? ? ?異常被引發(fā)后,異常參數(shù)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)由于多數(shù)內(nèi)見異常是從StanardError派生的,和這個元組只包含了一個只是錯誤原因的字符串,而調(diào)用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([])這里給出一個讀取文件的針對異常處理的經(jīng)典方式
try:try:cfile = open("test,txt",'r')tx = cfile.readlines()except IOError:log.write("no tx this month\n") finally:cfile.close()代碼片會嘗試打開并且讀取數(shù)據(jù),如果在某一步發(fā)生了錯誤,會寫入到日志,隨后文件被正確關閉。此外還有一個with語句,該語句的目的雜魚從流程圖中把try,except,finally關鍵字和資源分配釋放相關代碼統(tǒng)統(tǒng)去掉。
with context_expr [as var]:with_suite注意with僅能鞏固支持上下文管理協(xié)議的對象,而file是可以,其他的這里先不介紹
with open("/etc/passwd",'r') as f:for eachline in f:pass如果一切正常,把文件對象賦值給f,然后是迭代器遍歷文件中的每一行,當完成時,關閉文件,無論在這一段代碼的開始,中間,還是結(jié)束時發(fā)生異常,會執(zhí)行清理的代碼,此外文件仍會被自動關閉。總結(jié)
- 上一篇: 列表解析和生成器表达式
- 下一篇: 定制类