摘要:關(guān)鍵字拼寫(xiě)錯(cuò)誤時(shí)會(huì)提示語(yǔ)法錯(cuò)誤,而變量名函數(shù)名拼寫(xiě)錯(cuò)誤會(huì)在運(yùn)行時(shí)給出的錯(cuò)誤提示腳本程序不符合的語(yǔ)法規(guī)范例如如少了括號(hào),冒號(hào)等符號(hào),以及表達(dá)式書(shū)寫(xiě)錯(cuò)誤等。異常的處理異常是程序在運(yùn)行過(guò)程中引發(fā)的錯(cuò)誤。
異常是Python程序在運(yùn)行過(guò)程中引發(fā)的錯(cuò)誤,如果程序中引發(fā)了未進(jìn)行處理的異常,程序就會(huì)由于異常而終止運(yùn)行,只有為程序添加異常處理,才能使程序更“健壯”。
Python對(duì)異常的處理,有它自己的語(yǔ)法形式,掌握如何在Python中處理異常和進(jìn)行程序調(diào)試,主要內(nèi)容有:
列表項(xiàng)目
列表項(xiàng)目
語(yǔ)法錯(cuò)誤;
異常的概念;
用try語(yǔ)句捕獲異常;
常見(jiàn)異常的處理;
自定義異常;
使用pdb調(diào)試Python程序。
7.1 語(yǔ)法錯(cuò)誤1.拼寫(xiě)錯(cuò)誤
即Python語(yǔ)言中的關(guān)鍵字寫(xiě)錯(cuò),變量名、函數(shù)名拼寫(xiě)錯(cuò)誤等。
關(guān)鍵字拼寫(xiě)錯(cuò)誤時(shí)會(huì)提示SyntaxError(語(yǔ)法錯(cuò)誤),而變量名、函數(shù)名拼寫(xiě)錯(cuò)誤會(huì)在運(yùn)行時(shí)給出NameError的錯(cuò)誤提示.
2.腳本程序不符合Python的語(yǔ)法規(guī)范
例如如少了括號(hào),冒號(hào)等符號(hào),以及表達(dá)式書(shū)寫(xiě)錯(cuò)誤等。
3.縮進(jìn)錯(cuò)誤
因?yàn)镻ython語(yǔ)法規(guī)定,以縮進(jìn)作為程序的語(yǔ)法之一,這應(yīng)該是Python語(yǔ)言獨(dú)特的一面。一般來(lái)說(shuō)Python標(biāo)準(zhǔn)的縮進(jìn)是以4個(gè)空格作為一個(gè)縮進(jìn)。當(dāng)然,你可以依據(jù)自己的習(xí)慣,使用Tab也可以。但同一個(gè)程序或項(xiàng)目中應(yīng)該統(tǒng)一使用同一種縮進(jìn)風(fēng)格。
7.2 異常的處理異常是Python程序在運(yùn)行過(guò)程中引發(fā)的錯(cuò)誤。如果程序中引發(fā)了未進(jìn)行處理的異常,腳本就會(huì)由于異常而終止運(yùn)行。只有在程序中捕獲這些異常,并進(jìn)行相關(guān)的處理,才能使程序不會(huì)中斷運(yùn)行。
Python中使用try語(yǔ)句來(lái)處理異常,和Python中其他語(yǔ)句一樣,try語(yǔ)句也要使用縮進(jìn)結(jié)構(gòu),try語(yǔ)句也有一個(gè)可選的else語(yǔ)句塊。一般的try語(yǔ)句基本形式如下。
try: <語(yǔ)句(塊)> #可能產(chǎn)生異常的語(yǔ)句(塊) except <異常名1>: #要處理的異常 <語(yǔ)句(塊)> #異常處理語(yǔ)句 except <異常名2>: #要處理的異常 <語(yǔ)句(塊)> #異常處理語(yǔ)句 else: <語(yǔ)句(塊)> #未觸發(fā)異常,則執(zhí)行該語(yǔ)句(塊) finally: <語(yǔ)句(塊)> #始終執(zhí)行該語(yǔ),一般為了達(dá)到釋放資源等目的
在實(shí)際應(yīng)用中可以根據(jù)程序的需要而使用部分語(yǔ)句,常見(jiàn)的形式有:
形式一:
try: <語(yǔ)句(塊)> except <異常名1>: <語(yǔ)句(塊)>
舉例:
def testTry (index, flag=False): stulst = ["John","Jenny","Tom"] if flag: #flag為T(mén)rue時(shí),捕獲異常 try: astu = stulst [index] except IndexError: print("IndexError") return "Try Test Finished!" else: #flag為False時(shí),不捕獲異常 astu =stulst [index] return "No Try Test Finished!" print("Right params testing start...") print (testTry (1, True)) #不越界參數(shù),捕獲異常(正常) print (testTry (1, False)) #不越界參數(shù),不捕獲異常(正常) print("Error params testing start...") print (testTry (4, True)) #越界參數(shù),捕獲異常(正常) print (testTry (4, False)) #越界參數(shù),不捕獲異常(程序運(yùn)行會(huì)中斷)
形式二:
try: <語(yǔ)句(塊)> except < 異常名1>: <語(yǔ)句(塊)> finally: <語(yǔ)句(塊)>
舉例:
def testTryFinally (index): stulst = ["John","Jenny", "Tom"] af = open ("my.txt", "wt+") try: af.write(stulst[index]) except: pass finally: af.close() #無(wú)論是否產(chǎn)生越界異常,都關(guān)閉文件 print("File already had been closed!") print("No IndexError...") testTryFinally (1) #無(wú)越界異常,正常關(guān)閉文件 print("IndexError...") testTryFinally (4) #有越界異常,正常關(guān)閉文件
在Python中常見(jiàn)的異常都已經(jīng)預(yù)定義好了,在交互式環(huán)境中,用dir(__builtins__)命令,就會(huì)顯示出所有的預(yù)定義異常。
異常名 | 描述 |
---|---|
AttributeError | 調(diào)用不存在的方法引發(fā)的異常 |
EOFError | 遇到文件末尾引發(fā)的異常 |
ImportError | 導(dǎo)入模塊出錯(cuò)引發(fā)的異常 |
IndexError | 列表越界引發(fā)的異常 |
IOError | I/O操作引發(fā)的異常,如打開(kāi)文件出錯(cuò)等 |
KeyError | 使用字典中不存在的關(guān)鍵字引發(fā)的異常 |
NameError | 使用不存在的變量名引發(fā)的異常 |
TabError | 語(yǔ)句塊縮進(jìn)不正確引發(fā)的異常 |
ValueError | 搜索列表中不存在的值引發(fā)的異常 |
ZeroDivisionError | 除數(shù)為零引發(fā)的異常 |
except語(yǔ)句主要有以下幾種用法:
except: #捕獲所有異常; except <異常名>: #捕獲指定異常; except (異常名1,異常名2): #捕獲異常名1或者異常名2; except <異常名> as <數(shù)據(jù)>: #捕獲指定異常及其附加的數(shù)據(jù); except(異常名1,異常名2)as <數(shù)據(jù)>: #捕獲異常名1或者異常名2及異常的附加數(shù)據(jù)。7.3 手工拋出異常
為了程序的需要,程序員還可以自定義新的異常類(lèi)型,例如對(duì)用戶輸入文本的長(zhǎng)度有要求,則可以使用raise引發(fā)異常,以確保文本輸入的長(zhǎng)度符合要求。
使用raise引發(fā)異常十分簡(jiǎn)單,raise有以下幾種使用方式。
raise 異常名
raise 異常名,附加數(shù)據(jù)
raise 類(lèi)名
使用raise可以拋出各種預(yù)定的異常,即使程序在運(yùn)行時(shí)根本不會(huì)引發(fā)該異常。
def testRaise2(): for i in range (5): try: if i==2: #i==2拋出NameError異常 raise NameError except NameError: print("Raise a NameError!") print (i) print("end...") testRaise2 ()
運(yùn)行結(jié)果:
0 1 Raise a NameError! 2 3 4 end...7.3.2 assert語(yǔ)句
assert語(yǔ)句的一般形式如下。
assert <條件測(cè)試>, <異常附加數(shù)據(jù)> #其中異常附加數(shù)據(jù)是可選的
assert語(yǔ)句是簡(jiǎn)化的raise語(yǔ)句,它引發(fā)異常的前提是其后面的條件測(cè)試為假。
舉例:
def testAssert(): for i in range (3): try: assert i<2 except AssertionError: print("Raise a AssertionError!") print (i) print("end...") testAssert()
運(yùn)行結(jié)果:
0 1 Raise a AssertionError! 2 end...
assert語(yǔ)句一般用于在程序開(kāi)發(fā)時(shí)測(cè)試代碼的有效性。比如某個(gè)變量的值必須在一定范圍內(nèi),而運(yùn)行時(shí)得到的值不符合要求,則引發(fā)該異常,對(duì)開(kāi)發(fā)者予以提示。所以一般在程序開(kāi)發(fā)中,不去捕獲這個(gè)異常,而是讓它中斷程序。原因是程序中已經(jīng)出現(xiàn)了問(wèn)題,不應(yīng)繼續(xù)運(yùn)行。
assert語(yǔ)句并不是總是運(yùn)行的,只有Python內(nèi)置的一個(gè)特殊變量__debug__為T(mén)rue時(shí)才運(yùn)行。要關(guān)閉程序中的assert語(yǔ)句就使用python-O(短畫(huà)線,后接大寫(xiě)字母O)來(lái)運(yùn)行程序。
在Python中定義異常類(lèi)不用從基礎(chǔ)完全自己定義,只要通過(guò)繼承Exception類(lèi)來(lái)創(chuàng)建自己的異常類(lèi)。異常類(lèi)的定義和其他類(lèi)沒(méi)有區(qū)別,最簡(jiǎn)單的自定義異常類(lèi)甚至可以只繼承Exception類(lèi),類(lèi)體為pass如:
class MyError (Exception): #繼承Exception類(lèi) pass
如果需要異常類(lèi)帶有一定的提示信息,也可以重載__init__和__str__這兩個(gè)方法。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/43550.html
摘要:調(diào)試器可幫助程序員分析完整的代碼。我們將使用標(biāo)準(zhǔn)庫(kù)中的模塊調(diào)試我們的腳本。例外是程序執(zhí)行期間發(fā)生的錯(cuò)誤。設(shè)置斷點(diǎn)并檢查堆棧幀,并列出源代碼。輸入以繼續(xù)調(diào)試。分析和計(jì)時(shí)程序分析程序意味著測(cè)量程序的執(zhí)行時(shí)間。的模塊用于分析程序。 showImg(https://segmentfault.com/img/remote/1460000018807029?w=902&h=442); 來(lái)源 | ...
摘要:返回的信息特定于當(dāng)前線程以及當(dāng)前堆棧幀。出于某些原因,這個(gè)值可能無(wú)法計(jì)算,將返回返回安卓版本的構(gòu)建時(shí)間,以整數(shù)表示。僅適用于安卓平臺(tái)返回解釋器的檢查間隔??刹僮鞔藢傩詫?shí)現(xiàn)強(qiáng)制重新加載模塊等。 sys模塊提供對(duì)由解釋器使用或維護(hù)的某些變量、與解釋器交互的函數(shù)的訪問(wèn)接口。 sys.abiflags 在使用標(biāo)準(zhǔn)configure腳本構(gòu)建python的POSIX系統(tǒng)上,該屬性包含了PEP 31...
摘要:上一篇文章第三章概念及應(yīng)用第三節(jié)客戶端編程下一篇文章第四章網(wǎng)站部署第二節(jié)靜態(tài)文件之前著重講解的編程知識(shí)點(diǎn),所有之前的例子都使用最簡(jiǎn)單的啟動(dòng)方式運(yùn)行。 上一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第三節(jié):客戶端編程下一篇文章:Python:Tornado 第四章:Tornado網(wǎng)站部署:第二節(jié):靜態(tài)文件 之前著重講解Tornado的編程知...
摘要:但在開(kāi)發(fā)時(shí)不要使用異常處理,否則阻止了報(bào)錯(cuò)信息的發(fā)出,影響調(diào)試。的作用主要是確定程序的運(yùn)行路徑。二分查找法是一個(gè)定位問(wèn)題的技巧。 前言 幾年來(lái)我在答疑群、論壇、公眾號(hào)、知乎回答的各種問(wèn)題,沒(méi)有一萬(wàn)也有八千。其中有三分之二以上都是在幫人看報(bào)錯(cuò),幫人 debug(調(diào)試代碼) 。 可以說(shuō), 會(huì)不會(huì) debug,有沒(méi)有 debug 的意識(shí),懂不懂 debug 的技巧,是有沒(méi)有入門(mén)編程的重要標(biāo)志...
摘要:最近添加的功能是通過(guò)表單上傳文件。腳本的輸出由兩部分組成,由一個(gè)空行分割。后者接受重復(fù)鍵值二進(jìn)制文件等。方法會(huì)返回所有為的值。進(jìn)行類(lèi)型檢查是必須的,因?yàn)闀?huì)有好事的用戶,輸入重復(fù)的鍵名。 cgi 通用網(wǎng)關(guān)接口 前驅(qū)知識(shí) 網(wǎng)關(guān)協(xié)議學(xué)習(xí):CGI、FastCGI、WSGI 簡(jiǎn)單點(diǎn)說(shuō): web服務(wù)器接受請(qǐng)求,啟動(dòng)CGI;CGI接受請(qǐng)求,處理,返回給服務(wù)器;服務(wù)器返回給用戶 cgi效率不高,每...
閱讀 1816·2021-11-25 09:43
閱讀 2740·2019-08-30 15:53
閱讀 1882·2019-08-30 15:52
閱讀 2972·2019-08-29 13:56
閱讀 3384·2019-08-26 12:12
閱讀 631·2019-08-23 17:58
閱讀 2213·2019-08-23 16:59
閱讀 1021·2019-08-23 16:21