python Exception(异常处理)
生活随笔
收集整理的這篇文章主要介紹了
python Exception(异常处理)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
python異常:
? ?python在運(yùn)行時(shí)錯(cuò)誤稱為異常
? ? ? ?語法錯(cuò)誤:軟件的結(jié)構(gòu)上有錯(cuò)誤而導(dǎo)致不能被解釋器解釋或不能被編譯器編譯。
? ? ? ?邏輯錯(cuò)誤:由于不完整或不合法的輸入所致,也可能是邏輯無法生成、計(jì)算或者出結(jié)果需要的過程無法執(zhí)行等。
? ?默認(rèn)情況下:python腳本執(zhí)行過程中出現(xiàn)異常后,腳本執(zhí)行將被終止。
? ?
? ?python 異常是一個(gè)對(duì)象,表示錯(cuò)誤或意外的情況
? ?在python檢測(cè)到一個(gè)錯(cuò)誤時(shí),將觸發(fā)一個(gè)異常:
? ? ? ?python可以通過異常傳導(dǎo)機(jī)制傳遞一個(gè)異常對(duì)象,發(fā)出一個(gè)異常情況出現(xiàn)的信號(hào)。
? ? ? ?程序員也可以在代碼中托運(yùn)觸發(fā)異常
? ?python異常也可以理解為:程序出現(xiàn)了錯(cuò)誤,而在正常控制流以外采取的行為
? ? ? ?第一階段:解釋器觸發(fā)異常,此時(shí)當(dāng)前程序流將被打斷。
? ? ? ?第二階段:異常處理,如忽略非致命錯(cuò)誤、減輕錯(cuò)誤帶來的影響等。
異常的功用
? ?錯(cuò)誤處理:
? ? ? ?python的默認(rèn)處理:停止程序,打印錯(cuò)誤消息
? ? ? ?使用try語句處理異常,并從異常中恢復(fù)
? ?事件通知:
? ? ? ?用于發(fā)出有效狀態(tài)信號(hào)
? ?特殊情況處理:
? ? ? ?無法調(diào)整代碼去處理的場景
? ?終止行為:
? ? ? ?try/finally語句可確保執(zhí)行必需的結(jié)束處理機(jī)制
? ?非常規(guī)控制流程:
? ? ? ?異常是一種高級(jí)跳轉(zhuǎn)(goto)機(jī)制
異常對(duì)象
? ?python異常是內(nèi)置的經(jīng)典類exception的子類的實(shí)例
? ? ? ?為了向后兼容,python還允許使用字符串或任何經(jīng)典類實(shí)例
? ? ? ?python2.5之后,exception是從BaseException繼承的新式類(即exception的父類是BaseException類)
? ?python自身引發(fā)的所有異常都是Exception的子類的實(shí)例
? ?大多的標(biāo)準(zhǔn)異常都是由StandardError派生的,其有3個(gè)抽象的子類
? ? ? ?ArithmeticError:由于算術(shù)錯(cuò)誤而引發(fā)的異常基類;包括:OverflowError、ZeroDivisionError、FloatingPorintError
? ? ? ?LookupError:容器在接收到一個(gè)無效的鍵或索引時(shí)引發(fā)的異常的基類;包括:IndexError、KeyError
? ? ? ?EnvironmentError:由于外部原因而導(dǎo)致的異常的基類;包括:IOError、OSError、WindowsError
? ? ? ? ? ?
標(biāo)準(zhǔn)異常類
? ?AssertionError:斷言語句失敗
? ?AttributeError:屬性引用或賦值失敗
? ?FloatingPointError:浮點(diǎn)型運(yùn)算失敗
? ?IOError:I/O操作失敗
? ?ImportError:import語句不能找到要導(dǎo)入的模塊,或者不能找到該模塊特別請(qǐng)求的名稱。
? ?IndentationError:解析器遇到了一個(gè)由于錯(cuò)誤的縮進(jìn)而引發(fā)的語法錯(cuò)誤
? ?IndexError:用來索引序列的整數(shù)超出了范圍。
? ?KeyError:用來索引映射的鍵不在映射中
? ?KeyboardInterrupt:用戶按了中斷鍵(ctrl+c、ctrl+break、delete鍵)
? ?MemoryError:運(yùn)算耗盡內(nèi)存
? ?NameError:引用了一個(gè)不存在的變量名
? ?NotImplementedError:由抽象基類引發(fā)的異常,用于指示一個(gè)具體的子類必須覆蓋一個(gè)方法
? ?OSError:由模塊os中的函數(shù)引發(fā)的異常,用來指示平臺(tái)相關(guān)的錯(cuò)誤
? ?OverflowError:整數(shù)運(yùn)算的結(jié)果太大導(dǎo)致溢出
? ?SyntaxError:語法錯(cuò)誤
? ?SystemError:python解釋器本身或某些擴(kuò)展模塊中的內(nèi)部錯(cuò)誤
? ?TypeError:對(duì)某對(duì)象執(zhí)行了不支持的操作
? ?UnboundLocalError:引用未綁定值的本地變量
? ?UnicodeError:在Unicode的字符串之間進(jìn)行轉(zhuǎn)換時(shí)發(fā)生的錯(cuò)誤
? ?ValueError:應(yīng)用于某個(gè)對(duì)象的操作或函數(shù),這個(gè)對(duì)象具有正確的類型,但確有不適當(dāng)?shù)闹?/span>
? ?WindowsError:模塊OS中的函數(shù)引發(fā)的異常,用于指示與windowsSHUDR QAYK
? ?ZeroDivisionError:除數(shù)為0引發(fā)的異常 ?
檢測(cè)和處理異常:
? ?異常通過try語句來檢測(cè):任何在try語句塊中的代碼都會(huì)被監(jiān)測(cè),以檢查有無異常發(fā)生。
? ?tr語句主要有兩種形式:
? ? ? ?try-except:檢測(cè)和處理異常
? ? ? ? ? ?可以有多個(gè)except;支持使用else子句處理沒有探測(cè)異常的執(zhí)行的代碼
? ? ? ?try-finally:僅檢查異常并做一些必要的清理工作
? ? ? ? ? ?僅能有一個(gè)finally
? ?try語句的復(fù)合形式: try-except-finally ? ?
? ?注意:try語句中的任何語句出現(xiàn)異常后,就會(huì)跳至定義的相關(guān)except中,而try結(jié)構(gòu)中發(fā)生異常之后的其它語句就不會(huì)再執(zhí)行。
? ?
? ?try - except語句:定義了進(jìn)程異常監(jiān)控的一段代碼,并且提供了處理異常的機(jī)制
? ?語法:
? ? ? ?try:
? ? ? ? ? ?try_suite
? ? ? ?except Exception[, reason]:
? ? ? ? ? ?except_suite
? ? ? ?或
? ? ? ?try:
? ? ? ? ? ?try_suite
? ? ? ?except (Exception1,Exception2[,...])[, reason]:
? ? ? ? ? ?except_suite
? ? ? ? ? ?
? ?例:
? ? ? ?try:
? ? ? ? ? ?f1 = open('/tmp/a.txt','r')
? ? ? ?except IOError, e:
? ? ? ? ? ?print 'Could not open file:', e
? ? ? ?或
? ? ? ?try:
? ? ? ? ? ?f1 = open('/tmp/a.txt','r')
? ? ? ?except (IOError,AttrubitError), e:
? ? ? ? ? ?print 'Could not open file:', e
? ?try-except-else語句: try語句可以帶多個(gè)except子句,還可以有一個(gè)可選的else子句
? ?語法格式如下:
? ? ? ?try:
? ? ? ? ? ?try_suite
? ? ? ?except Exception1[, reason]:
? ? ? ? ? ?suite_exception1
? ? ? ?except (Exception2, Exception3, ...)[, reason]: ? ? #一次捕獲多個(gè)異常時(shí)要定義為元組
? ? ? ? ? ?suite_
? ? ? ?...
? ? ? ?except: ? ? ? ? #空except語句用于捕獲一切異常;或者使用 except Exception,e: ? 也可以捕獲一切異常
? ? ? ? ? ?suite_
? ? ? ?else: ? ? ? ? ? ?#沒有出現(xiàn)錯(cuò)誤時(shí)執(zhí)行的代碼
? ? ? ? ? ?else_suite
? ? ? ? ? ?
? ? ? ?except 分句個(gè)數(shù)沒有限制,但else只能有一個(gè);沒有異常發(fā)生時(shí),else分句才會(huì)執(zhí)行
? ? ? ?沒有符合的except分句時(shí),異常會(huì)向上傳遞到程序中的之前進(jìn)程的try中或者到進(jìn)程的頂層(解釋器)
? ?
? ?try-finally語句:無論異常是否發(fā)生,finally子句都會(huì)執(zhí)行。常用于定義必需進(jìn)行的清理動(dòng)作,如關(guān)閉文件或斷開服務(wù)器連接等。
? ?finally中的所有代碼執(zhí)行完畢后會(huì)繼續(xù)向上一層引發(fā)異常
? ?語法:
? ? ? ?try:
? ? ? ? ? ?try_suite
? ? ? ?finally:
? ? ? ? ? ?finally_suite
? ? ? ? ? ?
? ?例:
? ? ? ?try:
? ? ? ? ? ?f1 = open('/tmp/a.txt','r')
? ? ? ? ? ?f1.write('hello world')
? ? ? ?finally:
? ? ? ? ? ?f1.close() ? ? ? ? ? ?
? ? ? ?關(guān)閉文件后繼續(xù)向上觸發(fā)異常
? ?exception 表示異常類型 reason表示接收異常原因的變量
? ?NameError
? ?IOError
? ?TypeError
? ?SyntaxError
? ?KeyError
? ?AttributeError
? ?IndexError
? ?ZeroDivisionError ?除0錯(cuò)誤
??
? ?#!/usr/bin/python27
? ?#
? ?try:
? ?while True:
? ?d1 = raw_input("An integer:")
? ?if d1 == 'quit': break
? ?d2 = raw_input("Another integer:")
? ?print int(d1) / int(d2)
? ?except ZeroDivisionError, e:
? ?print "not 0"
? ?except ValueError:
? ?print "not string"
? ?except:
? ?print "Unkown error"
總結(jié):try語句的分句形式
? ?except: ? ? ? ? 捕捉所有(其他)異常類型
? ?except name: ? ?只捕捉特定的異常
? ?except name, value: 捕捉所有列出的異常和其額外的數(shù)據(jù)(或?qū)嵗?
? ?except (name1, name2): ? ? ?捕捉任何列出的異常
? ?except (name1, name2), value: ? 捕捉任何列出的異常,并取得其額外數(shù)據(jù)
? ?else: ? ? ? ? ? ? ? ? ? 如果沒有引發(fā)異常,就運(yùn)行
? ?finally: ? ? ? ?總是會(huì)運(yùn)行此代碼塊
? ?語法: ? ?
? ? ? ?try:
? ? ? ? ? ?try_suite
? ? ? ?except ?Exception1:
? ? ? ? ? ?suite1_exception1
? ? ? ?except (exception2, exception3):
? ? ? ? ? ?suite23_exception23
? ? ? ?...
? ? ? ?else:
? ? ? ? ? ?else_suite
? ? ? ?finally:
? ? ? ? ? ?finally_suite
? ? ? ?可以替換為在try-finally語句中嵌套try-except語句的形式。
? ?
? ? ? ?try:
? ? ? ? ? ?try:
? ? ? ? ? ? ? ?try_suite
? ? ? ? ? ?except ...
? ? ? ? ? ?except ...
? ? ? ? ? ?else ..
? ? ? ?finally:
? ? ? ? ? ?....
??
自定義異常:
? ?raise語句可顯式觸發(fā)異常(即手機(jī)觸發(fā)異常)
? ? ? ?raise [SomeException [, args [, traceback]]]
? ? ? ? ? ?SomeException:可選,異常的名字,僅能使用字符串、類或?qū)嵗?/span>
? ? ? ? ? ?args:可選,以元組的形式傳遞給異常的參數(shù)
? ? ? ? ? ?traceback:可選,異常觸發(fā)時(shí)新生成的一個(gè)用于異常--正常化的跟蹤記錄,多用于重新引發(fā)異常時(shí)使用。 ? ? ? ? ? ? ? ?
? ?例:
? ? ? ?def f1(seq1,seq2):
? ? ? ? ? ?if not seq1 or not seq2:
? ? ? ? ? ? ? ?raise ValueError, "Seq must not be empty."
? ? ? ? ? ?print [ (x,y) for x in seq1 fro y in seq2 ]
? ? ? ? ? ?
? ? ? ?l1 = [1,2,3]
? ? ? ?l2 = ['a','b','c']
? ? ? ?f1(l1,l2)
? ? ? ?l3 = []
? ? ? ?f1(l1,l3) ? ? ? 提示自定義的異常
? ? ? ?
? ?try:
? ? ? ?f1 = open('/tmp/a/b.txt','r')
? ?except BaseException:
? ? ? ?print "Eroor occurs" ? ?
? ?#注意:BaseException是所有異常對(duì)象的父類,所以它可以接收所有的異常。
? ?
? ?try:
? ? ? ?a = 3 / 0
? ?except BaseException:
? ? ? ?print "Error occurs."
? ? ? ?
? ?自定義異常類:
? ? ? ?自定義異常類和多重繼承。較有效的方法是從自定義異常類和標(biāo)準(zhǔn)異常類進(jìn)行多重繼承,例如:
? ? ? ? ? ?class CustomAttributeError(CustomException,AttributeError):
? ? ? ? ? ? ? ?pass
? ? ? ?標(biāo)準(zhǔn)庫中使用的其它異常
? ? ? ? ? ?python標(biāo)準(zhǔn)庫中的許多模塊都定義了自己的異常類,如socket中的socket.error; 等同于自定義的異常類
? ? ? ? ? ?
? ?例:
? ? ? ?class MyError(Exception):
? ? ? ? ? ?def __init__(self,msg):
? ? ? ? ? ? ? ?self.Message=msg
? ? ? ? ? ?def __str__(self):
? ? ? ? ? ? ? ?return self.Message
? ? ? ? ? ?
? ? ? ?try:
? ? ? ? ? ?a=1
? ? ? ? ? ?raise MyError('錯(cuò)誤測(cè)試')
? ? ? ?except Exception,e:
? ? ? ? ? ?print e
? ?assert語句:
? ?assert語句用于在程序中引入調(diào)度代碼,語法如下:
? ? ? ?assert ?condition[, expression]
? ? ? ?說明:如果condition條件滿足,則assert不做任何操作;如果condition條件不滿足,則assert使用expression作為參數(shù)實(shí)例化AssertionError并引發(fā)結(jié)果實(shí)例(即生成一個(gè)自定義的斷言異常對(duì)象)
? ? ? ?注意:如果運(yùn)行python時(shí)使用了-O優(yōu)化選項(xiàng),則assert將是一個(gè)空操作:編譯器不為assert語句生成代碼
? ? ? ?運(yùn)行python時(shí)不使用-O選項(xiàng),則__debug__內(nèi)置變量為True,否則其值為False
? ? ? ?assert語句相當(dāng)于下面的代碼:
? ? ? ? ? ?if __debug__:
? ? ? ? ? ? ? ?if not condition:
? ? ? ? ? ? ? ? ? ?raise AssertionError, <expression>
? ? ? ?assert實(shí)現(xiàn):手動(dòng)觸發(fā)異常。 ? ?
? ? ? ?assert 1 == 0, 'Something wrong'
本文轉(zhuǎn)自 meteor_hy 51CTO博客,原文鏈接:http://blog.51cto.com/caiyuanji/1834031,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
? ?python在運(yùn)行時(shí)錯(cuò)誤稱為異常
? ? ? ?語法錯(cuò)誤:軟件的結(jié)構(gòu)上有錯(cuò)誤而導(dǎo)致不能被解釋器解釋或不能被編譯器編譯。
? ? ? ?邏輯錯(cuò)誤:由于不完整或不合法的輸入所致,也可能是邏輯無法生成、計(jì)算或者出結(jié)果需要的過程無法執(zhí)行等。
? ?默認(rèn)情況下:python腳本執(zhí)行過程中出現(xiàn)異常后,腳本執(zhí)行將被終止。
? ?
? ?python 異常是一個(gè)對(duì)象,表示錯(cuò)誤或意外的情況
? ?在python檢測(cè)到一個(gè)錯(cuò)誤時(shí),將觸發(fā)一個(gè)異常:
? ? ? ?python可以通過異常傳導(dǎo)機(jī)制傳遞一個(gè)異常對(duì)象,發(fā)出一個(gè)異常情況出現(xiàn)的信號(hào)。
? ? ? ?程序員也可以在代碼中托運(yùn)觸發(fā)異常
? ?python異常也可以理解為:程序出現(xiàn)了錯(cuò)誤,而在正常控制流以外采取的行為
? ? ? ?第一階段:解釋器觸發(fā)異常,此時(shí)當(dāng)前程序流將被打斷。
? ? ? ?第二階段:異常處理,如忽略非致命錯(cuò)誤、減輕錯(cuò)誤帶來的影響等。
異常的功用
? ?錯(cuò)誤處理:
? ? ? ?python的默認(rèn)處理:停止程序,打印錯(cuò)誤消息
? ? ? ?使用try語句處理異常,并從異常中恢復(fù)
? ?事件通知:
? ? ? ?用于發(fā)出有效狀態(tài)信號(hào)
? ?特殊情況處理:
? ? ? ?無法調(diào)整代碼去處理的場景
? ?終止行為:
? ? ? ?try/finally語句可確保執(zhí)行必需的結(jié)束處理機(jī)制
? ?非常規(guī)控制流程:
? ? ? ?異常是一種高級(jí)跳轉(zhuǎn)(goto)機(jī)制
異常對(duì)象
? ?python異常是內(nèi)置的經(jīng)典類exception的子類的實(shí)例
? ? ? ?為了向后兼容,python還允許使用字符串或任何經(jīng)典類實(shí)例
? ? ? ?python2.5之后,exception是從BaseException繼承的新式類(即exception的父類是BaseException類)
? ?python自身引發(fā)的所有異常都是Exception的子類的實(shí)例
? ?大多的標(biāo)準(zhǔn)異常都是由StandardError派生的,其有3個(gè)抽象的子類
? ? ? ?ArithmeticError:由于算術(shù)錯(cuò)誤而引發(fā)的異常基類;包括:OverflowError、ZeroDivisionError、FloatingPorintError
? ? ? ?LookupError:容器在接收到一個(gè)無效的鍵或索引時(shí)引發(fā)的異常的基類;包括:IndexError、KeyError
? ? ? ?EnvironmentError:由于外部原因而導(dǎo)致的異常的基類;包括:IOError、OSError、WindowsError
? ? ? ? ? ?
標(biāo)準(zhǔn)異常類
? ?AssertionError:斷言語句失敗
? ?AttributeError:屬性引用或賦值失敗
? ?FloatingPointError:浮點(diǎn)型運(yùn)算失敗
? ?IOError:I/O操作失敗
? ?ImportError:import語句不能找到要導(dǎo)入的模塊,或者不能找到該模塊特別請(qǐng)求的名稱。
? ?IndentationError:解析器遇到了一個(gè)由于錯(cuò)誤的縮進(jìn)而引發(fā)的語法錯(cuò)誤
? ?IndexError:用來索引序列的整數(shù)超出了范圍。
? ?KeyError:用來索引映射的鍵不在映射中
? ?KeyboardInterrupt:用戶按了中斷鍵(ctrl+c、ctrl+break、delete鍵)
? ?MemoryError:運(yùn)算耗盡內(nèi)存
? ?NameError:引用了一個(gè)不存在的變量名
? ?NotImplementedError:由抽象基類引發(fā)的異常,用于指示一個(gè)具體的子類必須覆蓋一個(gè)方法
? ?OSError:由模塊os中的函數(shù)引發(fā)的異常,用來指示平臺(tái)相關(guān)的錯(cuò)誤
? ?OverflowError:整數(shù)運(yùn)算的結(jié)果太大導(dǎo)致溢出
? ?SyntaxError:語法錯(cuò)誤
? ?SystemError:python解釋器本身或某些擴(kuò)展模塊中的內(nèi)部錯(cuò)誤
? ?TypeError:對(duì)某對(duì)象執(zhí)行了不支持的操作
? ?UnboundLocalError:引用未綁定值的本地變量
? ?UnicodeError:在Unicode的字符串之間進(jìn)行轉(zhuǎn)換時(shí)發(fā)生的錯(cuò)誤
? ?ValueError:應(yīng)用于某個(gè)對(duì)象的操作或函數(shù),這個(gè)對(duì)象具有正確的類型,但確有不適當(dāng)?shù)闹?/span>
? ?WindowsError:模塊OS中的函數(shù)引發(fā)的異常,用于指示與windowsSHUDR QAYK
? ?ZeroDivisionError:除數(shù)為0引發(fā)的異常 ?
檢測(cè)和處理異常:
? ?異常通過try語句來檢測(cè):任何在try語句塊中的代碼都會(huì)被監(jiān)測(cè),以檢查有無異常發(fā)生。
? ?tr語句主要有兩種形式:
? ? ? ?try-except:檢測(cè)和處理異常
? ? ? ? ? ?可以有多個(gè)except;支持使用else子句處理沒有探測(cè)異常的執(zhí)行的代碼
? ? ? ?try-finally:僅檢查異常并做一些必要的清理工作
? ? ? ? ? ?僅能有一個(gè)finally
? ?try語句的復(fù)合形式: try-except-finally ? ?
? ?注意:try語句中的任何語句出現(xiàn)異常后,就會(huì)跳至定義的相關(guān)except中,而try結(jié)構(gòu)中發(fā)生異常之后的其它語句就不會(huì)再執(zhí)行。
? ?
? ?try - except語句:定義了進(jìn)程異常監(jiān)控的一段代碼,并且提供了處理異常的機(jī)制
? ?語法:
? ? ? ?try:
? ? ? ? ? ?try_suite
? ? ? ?except Exception[, reason]:
? ? ? ? ? ?except_suite
? ? ? ?或
? ? ? ?try:
? ? ? ? ? ?try_suite
? ? ? ?except (Exception1,Exception2[,...])[, reason]:
? ? ? ? ? ?except_suite
? ? ? ? ? ?
? ?例:
? ? ? ?try:
? ? ? ? ? ?f1 = open('/tmp/a.txt','r')
? ? ? ?except IOError, e:
? ? ? ? ? ?print 'Could not open file:', e
? ? ? ?或
? ? ? ?try:
? ? ? ? ? ?f1 = open('/tmp/a.txt','r')
? ? ? ?except (IOError,AttrubitError), e:
? ? ? ? ? ?print 'Could not open file:', e
? ?try-except-else語句: try語句可以帶多個(gè)except子句,還可以有一個(gè)可選的else子句
? ?語法格式如下:
? ? ? ?try:
? ? ? ? ? ?try_suite
? ? ? ?except Exception1[, reason]:
? ? ? ? ? ?suite_exception1
? ? ? ?except (Exception2, Exception3, ...)[, reason]: ? ? #一次捕獲多個(gè)異常時(shí)要定義為元組
? ? ? ? ? ?suite_
? ? ? ?...
? ? ? ?except: ? ? ? ? #空except語句用于捕獲一切異常;或者使用 except Exception,e: ? 也可以捕獲一切異常
? ? ? ? ? ?suite_
? ? ? ?else: ? ? ? ? ? ?#沒有出現(xiàn)錯(cuò)誤時(shí)執(zhí)行的代碼
? ? ? ? ? ?else_suite
? ? ? ? ? ?
? ? ? ?except 分句個(gè)數(shù)沒有限制,但else只能有一個(gè);沒有異常發(fā)生時(shí),else分句才會(huì)執(zhí)行
? ? ? ?沒有符合的except分句時(shí),異常會(huì)向上傳遞到程序中的之前進(jìn)程的try中或者到進(jìn)程的頂層(解釋器)
? ?
? ?try-finally語句:無論異常是否發(fā)生,finally子句都會(huì)執(zhí)行。常用于定義必需進(jìn)行的清理動(dòng)作,如關(guān)閉文件或斷開服務(wù)器連接等。
? ?finally中的所有代碼執(zhí)行完畢后會(huì)繼續(xù)向上一層引發(fā)異常
? ?語法:
? ? ? ?try:
? ? ? ? ? ?try_suite
? ? ? ?finally:
? ? ? ? ? ?finally_suite
? ? ? ? ? ?
? ?例:
? ? ? ?try:
? ? ? ? ? ?f1 = open('/tmp/a.txt','r')
? ? ? ? ? ?f1.write('hello world')
? ? ? ?finally:
? ? ? ? ? ?f1.close() ? ? ? ? ? ?
? ? ? ?關(guān)閉文件后繼續(xù)向上觸發(fā)異常
? ?exception 表示異常類型 reason表示接收異常原因的變量
? ?NameError
? ?IOError
? ?TypeError
? ?SyntaxError
? ?KeyError
? ?AttributeError
? ?IndexError
? ?ZeroDivisionError ?除0錯(cuò)誤
??
? ?#!/usr/bin/python27
? ?#
? ?try:
? ?while True:
? ?d1 = raw_input("An integer:")
? ?if d1 == 'quit': break
? ?d2 = raw_input("Another integer:")
? ?print int(d1) / int(d2)
? ?except ZeroDivisionError, e:
? ?print "not 0"
? ?except ValueError:
? ?print "not string"
? ?except:
? ?print "Unkown error"
總結(jié):try語句的分句形式
? ?except: ? ? ? ? 捕捉所有(其他)異常類型
? ?except name: ? ?只捕捉特定的異常
? ?except name, value: 捕捉所有列出的異常和其額外的數(shù)據(jù)(或?qū)嵗?
? ?except (name1, name2): ? ? ?捕捉任何列出的異常
? ?except (name1, name2), value: ? 捕捉任何列出的異常,并取得其額外數(shù)據(jù)
? ?else: ? ? ? ? ? ? ? ? ? 如果沒有引發(fā)異常,就運(yùn)行
? ?finally: ? ? ? ?總是會(huì)運(yùn)行此代碼塊
? ?語法: ? ?
? ? ? ?try:
? ? ? ? ? ?try_suite
? ? ? ?except ?Exception1:
? ? ? ? ? ?suite1_exception1
? ? ? ?except (exception2, exception3):
? ? ? ? ? ?suite23_exception23
? ? ? ?...
? ? ? ?else:
? ? ? ? ? ?else_suite
? ? ? ?finally:
? ? ? ? ? ?finally_suite
? ? ? ?可以替換為在try-finally語句中嵌套try-except語句的形式。
? ?
? ? ? ?try:
? ? ? ? ? ?try:
? ? ? ? ? ? ? ?try_suite
? ? ? ? ? ?except ...
? ? ? ? ? ?except ...
? ? ? ? ? ?else ..
? ? ? ?finally:
? ? ? ? ? ?....
??
自定義異常:
? ?raise語句可顯式觸發(fā)異常(即手機(jī)觸發(fā)異常)
? ? ? ?raise [SomeException [, args [, traceback]]]
? ? ? ? ? ?SomeException:可選,異常的名字,僅能使用字符串、類或?qū)嵗?/span>
? ? ? ? ? ?args:可選,以元組的形式傳遞給異常的參數(shù)
? ? ? ? ? ?traceback:可選,異常觸發(fā)時(shí)新生成的一個(gè)用于異常--正常化的跟蹤記錄,多用于重新引發(fā)異常時(shí)使用。 ? ? ? ? ? ? ? ?
? ?例:
? ? ? ?def f1(seq1,seq2):
? ? ? ? ? ?if not seq1 or not seq2:
? ? ? ? ? ? ? ?raise ValueError, "Seq must not be empty."
? ? ? ? ? ?print [ (x,y) for x in seq1 fro y in seq2 ]
? ? ? ? ? ?
? ? ? ?l1 = [1,2,3]
? ? ? ?l2 = ['a','b','c']
? ? ? ?f1(l1,l2)
? ? ? ?l3 = []
? ? ? ?f1(l1,l3) ? ? ? 提示自定義的異常
? ? ? ?
? ?try:
? ? ? ?f1 = open('/tmp/a/b.txt','r')
? ?except BaseException:
? ? ? ?print "Eroor occurs" ? ?
? ?#注意:BaseException是所有異常對(duì)象的父類,所以它可以接收所有的異常。
? ?
? ?try:
? ? ? ?a = 3 / 0
? ?except BaseException:
? ? ? ?print "Error occurs."
? ? ? ?
? ?自定義異常類:
? ? ? ?自定義異常類和多重繼承。較有效的方法是從自定義異常類和標(biāo)準(zhǔn)異常類進(jìn)行多重繼承,例如:
? ? ? ? ? ?class CustomAttributeError(CustomException,AttributeError):
? ? ? ? ? ? ? ?pass
? ? ? ?標(biāo)準(zhǔn)庫中使用的其它異常
? ? ? ? ? ?python標(biāo)準(zhǔn)庫中的許多模塊都定義了自己的異常類,如socket中的socket.error; 等同于自定義的異常類
? ? ? ? ? ?
? ?例:
? ? ? ?class MyError(Exception):
? ? ? ? ? ?def __init__(self,msg):
? ? ? ? ? ? ? ?self.Message=msg
? ? ? ? ? ?def __str__(self):
? ? ? ? ? ? ? ?return self.Message
? ? ? ? ? ?
? ? ? ?try:
? ? ? ? ? ?a=1
? ? ? ? ? ?raise MyError('錯(cuò)誤測(cè)試')
? ? ? ?except Exception,e:
? ? ? ? ? ?print e
? ?assert語句:
? ?assert語句用于在程序中引入調(diào)度代碼,語法如下:
? ? ? ?assert ?condition[, expression]
? ? ? ?說明:如果condition條件滿足,則assert不做任何操作;如果condition條件不滿足,則assert使用expression作為參數(shù)實(shí)例化AssertionError并引發(fā)結(jié)果實(shí)例(即生成一個(gè)自定義的斷言異常對(duì)象)
? ? ? ?注意:如果運(yùn)行python時(shí)使用了-O優(yōu)化選項(xiàng),則assert將是一個(gè)空操作:編譯器不為assert語句生成代碼
? ? ? ?運(yùn)行python時(shí)不使用-O選項(xiàng),則__debug__內(nèi)置變量為True,否則其值為False
? ? ? ?assert語句相當(dāng)于下面的代碼:
? ? ? ? ? ?if __debug__:
? ? ? ? ? ? ? ?if not condition:
? ? ? ? ? ? ? ? ? ?raise AssertionError, <expression>
? ? ? ?assert實(shí)現(xiàn):手動(dòng)觸發(fā)異常。 ? ?
? ? ? ?assert 1 == 0, 'Something wrong'
本文轉(zhuǎn)自 meteor_hy 51CTO博客,原文鏈接:http://blog.51cto.com/caiyuanji/1834031,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的python Exception(异常处理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怪兽级性能,用代码玩转Excel!葡萄城
- 下一篇: 可变数据类型和不可变数据类型