第4章 程序控制_第1頁
第4章 程序控制_第2頁
第4章 程序控制_第3頁
第4章 程序控制_第4頁
第4章 程序控制_第5頁
已閱讀5頁,還剩104頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、高級大數(shù)據(jù)人才培養(yǎng)Python程序設計BIG DATA張 燕總主編張雪萍主編唐萬梅副主編景雪琴副主編2 of 56高級大數(shù)據(jù)人才培養(yǎng)4 . 1異常4 . 24 . 3斷言日志4 . 4調(diào)試器習題第4章程序調(diào)試3 of 314.1異常第四章 程序控制Python有兩種錯誤很容易辨認:語法錯誤和異常。程序執(zhí)行過程中產(chǎn)生的大多數(shù)錯誤是語法錯誤,是由于程序員的疏忽造成的,如變量未聲明、零做除數(shù)、參數(shù)傳遞時個數(shù)不一致,或者類型匹配問題、文件打開方式與文件操作沖突,等等;也可能是程序執(zhí)行過程中遇到的不可預知的錯誤,如內(nèi)存或硬盤空間不足、網(wǎng)絡連接失敗、文件不能打開或系統(tǒng)出錯等。這些錯誤產(chǎn)生后如果不做適當處理

2、,程序的正常執(zhí)行將被中斷,這是用戶不可接受的。4 of 314.1異常第四章 程序控制異常是程序運行時發(fā)生的錯誤信號,它在編程過程中是不可避免的。異常就是一個,這個會在程序執(zhí)行過程中發(fā)生,影響程序的運行。當Python出現(xiàn)異常時,我們要進行捕獲與處理,否則程序會終止執(zhí)行。當Python檢測到一個錯誤時,解釋器就會指出當前程序已經(jīng)無法繼續(xù)執(zhí)行下去了,這時候就出現(xiàn)了異常,即異常是因為程序出現(xiàn)了錯誤而在正常控制流以外采取的行為。這個行為又分為兩個階段:首先是發(fā)生引起異常的錯誤,然后是檢測及采取可能的措施。5 of 314.1異常第四章 程序控制Python中有很多內(nèi)置的異常類型,它們都是由BaseE

3、xception類派生出來的。表4-1描述了經(jīng)常使用的異常類型,利用它們可以快速準確判斷異常類型,為修正錯誤帶來方便。6 of 314.1異常第四章 程序控制異 常 類 型描述IOError輸入/輸出異常,如打開不存在的文件IndentationError代碼縮進不正確時引發(fā)的異常KeyError在字典中訪問不存在的鍵時引發(fā)的異常SyntaxError代碼中存在語法錯誤時引發(fā)的異常數(shù)值錯誤,給函數(shù)傳遞了一個不期望的值, 如int(abc),參數(shù)abc不能轉(zhuǎn)變?yōu)閿?shù)值ValueError調(diào)用操作系統(tǒng)完成某些功能失敗時產(chǎn)生的異常OSErrorTypeError對類型無效的操作引發(fā)的異常ZeroDiv

4、isionError零作除數(shù)時產(chǎn)生的異常TypeError數(shù)據(jù)類型錯誤時引發(fā)的異常NameError訪問未定義或未初始化的變量時引發(fā)的異常IndexError對序列進行操作時,嘗試使用一個超出范圍的下標索引時引發(fā)的異常ImportError導入模塊或包異常,如指定的模塊不存在AttributeError引用一個對象不存在的屬性時引發(fā)的異常7 of 314.1異常第四章 程序控制【例4-1】 NameError和ZeroDivisionError異常的示例。 a = 3 b = 0 print(a + c)print(a / b)8 of 314.1異常第四章 程序控制【例4-2】if a bS

5、yntaxError和IndexError異常的示例。if條件后缺少了冒號“:”,屬于語法錯誤。 ls = 1,2,3,4,5 print(ls5)9 of 314.1異常第四章 程序控制異常處理機制能夠提高程序的健壯性,良好的異常處理機制可以讓程序面對非法輸入時有一定的應對能力,清晰的錯誤信息更能幫助程序員快速修復問題。10 of 314.1異常第四章 程序控制1.try語句的形式try語句有兩種主要形式:(1) try-except(2) try-finally一個try語句可以對應一個或多個except子句,但只能對應一個finally子句,或者用于一個try-except-finall

6、y復合語句。Python的異常處理用try-except語句實現(xiàn),它將可能出現(xiàn)錯誤的代碼放在try語句塊中,用except子句來捕獲異常并進行處理。11 of 314.1異常第四章 程序控制2.基本語法try:except as e1: except as e2: else: finally:12 of 314.1異常第四章 程序控制3. try-except語句執(zhí)行順序執(zhí)行try子句中的語句塊(在關(guān)鍵字try和關(guān)鍵字except之間的語句):(1) 如果沒有異常發(fā)生,又有else子句,就執(zhí)行else子句的代碼;否則,執(zhí)行try 語句之后的代碼。(2) 如果在執(zhí)行try子句中的語句塊的過程中發(fā)

7、生了異常,那么try子句的語句塊中余下的部分將被忽略。(3) 如果異常的類型和關(guān)鍵字except之后的異常類型相符,則對應的except子句將被執(zhí)行,以完成異常處理,然后執(zhí)行try語句之后的代碼,程序不會中斷。(4) 如果異常不能與所有except子句的異常類型匹配,則該異常會傳遞到上層的try語句中處理,如果上層的try語句沒有處理異?;蛏蠈記]有使用try語句,則程序中斷執(zhí)行。(5) 如果有finally子句,無論try子句是否產(chǎn)生異常,finally子句中的語句都會被執(zhí)行。13 of 314.1異常第四章 程序控制1)帶有單個except子句的try語句帶有單個except子句的try-e

8、xcept 語句的基本語法如下:try: #檢測異常except as e:#處理異常說明:as e可以省略,如果沒有省略的話,注意,as是關(guān)鍵字,e是參數(shù),名字由用戶定義。具體來說,e用print()將異常信息打印出來。常類實例,其中包含了異常信息,可以14 of 314.1異常第四章 程序控制【例4-3】 省略except語句中的as e,此時程序員不清楚導致異常的原因。#try-except語句try:a = 4b = 0c = a / bexcept ZeroDivisionError:print(ZeroDivisionError類型錯誤)說明:以上代碼輸出信息“ZeroDivisi

9、onError類型錯誤”是由程序員自己給出的(print()語句輸出的結(jié)果),但并不清楚此類異常是什么原因?qū)е碌?,這對后續(xù)程序的修改不能起到相應的提示作用!15 of 314.1異?!纠?-4】 通過except語句的as e將異常信息輸出。#try-except語句,通過參數(shù)e可以輸出產(chǎn)生異常的原因! try:a = 4b = 0c = a / bexcept ZeroDivisionError as e:print(ZeroDivisionError類型錯誤,錯誤的原因是:,e)第四章 程序控制異常參數(shù):一個異??梢詭蠀?shù),而此參數(shù)可以作常信息輸出。如上例中定義了一個“ZeroDivis

10、ionError”異常,參數(shù)是e,通過輸出異常參數(shù)的值可以清楚地知道產(chǎn)生異常的原因是0作了除數(shù)。下面的例子也是帶異常參數(shù)的情況。try:f = open(hp, r) except IOError as e:print(could not open file:原因是, e)16 of 314.1異?!纠?-5】 異常與except子句的異常類型不匹配。try:a = 3b = 0第四章 程序控制c = a / b# 0作了除數(shù)except ValueError as e:#發(fā)生的異常與except給出的異常類型ValueError不匹配,注意觀察輸出的錯誤信息是什么print(錯誤的原因是:,

11、e)說明:在執(zhí)行try子句的過程中,如果發(fā)生的異常不能與except子句的異常類型匹配,則對應的except子句不被執(zhí)行,即“print(錯誤的原因是:,e)”不會被執(zhí)行,程序?qū)⒅苯又袛噙\行并拋出異常。17 of 314.1異常第四章 程序控制2)帶有多個except子句的try語句基本語法如下:try:except as e1: except as e2:.except as en:作用:把多個except子句連接在一起,處理一個try語句塊中可能發(fā)生的多種異常。18 of 314.1異常第四章 程序控制【例4-6】 從鍵盤輸入兩個整數(shù),求其相除的結(jié)果。try:a = input(請輸入被除

12、數(shù):) b = input(請輸入除數(shù):)c = int(a) / int(b) except ValueError as e:print(ValueError類型錯誤,原因:,e) except ZeroDivisionError as e:print(ZeroDivisionError類型錯誤,原因:,e)(1)程序運行后分別輸入數(shù)6和3,無異常信息輸出:19 of 314.1異常第四章 程序控制(2)程序運行后分別輸入數(shù)4和0,由于0作了除數(shù),此時會拋出異常:(3)程序運行后分別輸入abc和3,由于int()函數(shù)的本意是把由數(shù)字構(gòu)成的字符串還原為數(shù)值,但這里輸入了abc,因此,系統(tǒng)拋出異

13、常:20 of 314.1異常第四章 程序控制【例4-7】 理解“如果在執(zhí)行try子句的過程中發(fā)生了異常,那么try子句余下的部分將被忽略”。#如果在執(zhí)行try子句的過程中發(fā)生了異常,那么try子句余下的部分將被忽略try:a = input(請輸入被除數(shù):) b = input(請輸入除數(shù):)c = int(a) / int(b) print(a = ,a)print(b = ,b)print(a/b = ,c) except ValueError as e:print(ValueError類型錯誤,原因:,e) except ZeroDivisionError as e:print(Zer

14、oDivisionError類型錯誤,原因:,e)請運行以上程序,分別輸入4和2、4和0、a和3,觀察輸出的結(jié)果(包含異常信息)。21 of 314.1異常第四章 程序控制3)處理多個異常的except子句基本語法格式如下:try:except () as e:說明:可以在一個except子句里處理多個異常,但前提是多個異常必須被放入一個元組里。22 of 314.1異常第四章 程序控制【例4-8】 一個except子句可以同時處理多個異常,這些異常將被放到一個括號里組成元組。try:a = int(input(請輸入除數(shù):)b = int(input(請輸入被除數(shù):) c = acvprin

15、t(a/b) print(a+b)print(b+c)except (ZeroDivisionError,TypeError,ValueError) as e: #捕獲多個異常,用元組表示多個異常print(e)23 of 314.1異常第四章 程序控制(1)程序運行后分別輸入數(shù)5和0,由于0作了除數(shù),此時會拋出異常:(2)程序運行后分別輸入數(shù)5和3,由于3不能和acv相加,此時會拋出異常:24 of 314.1異常4)try-else-except語句帶有else子句的try-except語句的基本語法如下:try:except as e1: except as e2: else:第四章 程

16、序控制說明:如果try子句中沒有發(fā)生任何異常,將執(zhí)行else子句的代碼塊,即不拋出任何異常。25 of 314.1異常第四章 程序控制【例4-9】 帶有else子句的try-except語句執(zhí)行情況的分析。#如果在執(zhí)行try子句的過程中發(fā)生了異常,那么try子句余下的部分將被忽略try:a = input(請輸入被除數(shù):) b = input(請輸入除數(shù):)c = int(a) / int(b) except ValueError as e:print(ValueError類型錯誤,原因:,e) except ZeroDivisionError as e:print(ZeroDivisionE

17、rror類型錯誤,原因:,e) else:#沒有發(fā)生任何異常,執(zhí)行else子句print(兩個數(shù)相除的結(jié)果是:,c)請運行程序,分別輸入6和2、5和0、2和b,觀察輸出的結(jié)果(包含異常信息)。26 of 314.1異?!纠?-10】 理解“沒有異常發(fā)生的情況”的確切含義。#try-except-else語句try:a = eval(input(請輸入a的值:) b = eval(input(請輸入b的值:) print(a / b = , a / b)except ZeroDivisionError as e: print(ZeroDivisionError類型錯誤,原因是:,e)except

18、 ValueError as e:print(ValueError類型錯誤,原因是:,e)else:#沒有異常發(fā)生執(zhí)行else子句。注意:這里的異常不僅是except列出的異常類型print(沒有異常,執(zhí)行else子句!)運行程序,根據(jù)輸入數(shù)據(jù)的不同,輸出如下不同的信息(包含異常信息)。第四章 程序控制27 of 314.1 異常(1) 沒有異常發(fā)生,執(zhí)行else子句: 請輸入a的值:4請輸入b的值:2a/b=2.0沒有異常,執(zhí)行else子句?。?) 發(fā)生了except子句列出的異常,不執(zhí)行else子句:第四章 程序控制(3)發(fā)生的是except子句未列出的異常,還是不執(zhí)行else子句:28

19、of 314.1異常第四章 程序控制(4)發(fā)生的還是except子句未列出的異常,仍然不執(zhí)行else子句:29 of 314.1異常第四章 程序控制5)Exception類型異常如果不確定異常類型,可以使用Exception類捕獲任意類型的異常。其語法格式如下:try:except Exception as e:注意:“Exception”為關(guān)鍵一個字母必須大寫。30 of 314.1異常第四章 程序控制【例4-11】 使用Exception類捕獲任意類型的異常。a = input(請輸入a的值:)try:r = 1/int(a)print(r = ,r) except Exception a

20、s e:print(異常是:, e)程序運行后根據(jù)輸入的數(shù)據(jù)不同,得到不同的輸出信息(包括異常信息)。31 of 314.1異常第四章 程序控制(1)未發(fā)生異常:(2)發(fā)生了0作除數(shù)的異常:(3)int()函數(shù)無法對非數(shù)字字符串進行轉(zhuǎn)換,因此發(fā)生了異常:32 of 314.1異常第四章 程序控制帶有Exception類的except子句可捕獲任何異常。捕獲Exception類型異常的except子句應該寫在捕獲準確類型異常的except子句之后,否則捕獲不到準確類型的異常,對應的except子句不起作用。33 of 314.1異常例如:a = input(請輸入a的值:) b = input(

21、請輸入b的值:) try:r = eval(a) / eval(b) w = eval(a) + eval(b) print(r = ,r)print(w = ,w)except ValueError as e: print(ValueError類型異常,原因是:, e)except ZeroDivisionError as e: print(ZeroDivisionError類型異常,原因是:, e)except Exception as e:print(其他異常,原因是:, e)運行后根據(jù)輸入數(shù)據(jù)的不同會輸出不同的信息。第四章 程序控制34 of 314.1異常第四章 程序控制(1)程序正

22、常執(zhí)行,未拋出異常:(2)拋出一個確定的異常:35 of 314.1異常第四章 程序控制(3)拋出程序員編程時未知的異常:(4)拋出程序員編程時未知的異常:思考:請仔細理解后兩種情況,為什么它們拋出的是兩種不同的異常?說明:應先捕獲類型明確的異常,如ValueError或ZeroDivisionError類型的異常,再捕獲其他未知異常,以便于異常分析處理和修正程序錯誤。36 of 314.1異常第四章 程序控制6)try-finally 語句其基本語法格式如下:try: finally:該語句執(zhí)行流程說明:(1) 如果在執(zhí)行語句塊1時沒有捕獲異常,則執(zhí)行語句塊2的代碼。(2) 如果捕獲到異常,

23、則先執(zhí)行語句塊2的代碼,然后讓解釋器進行異常處理??傊?,無論如何都會執(zhí)行語句塊2的代碼。37 of 314.1異?!纠?-12】 try-finally語句。第四章 程序控制#try-finally語句try:a = eval(input(請輸入a的值:) print(a的倒數(shù)為:, 1 / a)finally:#無論是否捕獲異常,此語句都將被執(zhí)行print(finally,結(jié)束了!)說明:無論是否捕獲異常,finally后的語句都會被執(zhí)行,仔細觀察以上程序運行后輸出的信息。38 of 314.1異常(1)沒有發(fā)生異常,執(zhí)行了關(guān)鍵字finally后的語句:第四章 程序控制(2)發(fā)生了異常,還是

24、執(zhí)行了關(guān)鍵字finally后的語句,之后再拋出異常信息:39 of 314.1異常7)try-except-finally語句第四章 程序控制其基本語法格式如下:try: except: finally:該語句執(zhí)行流程說明:(1) 如果try語句塊沒有發(fā)生異常,則執(zhí)行finally子句。(2) 如果try語句塊發(fā)生異常,則先處理異常,然后執(zhí)行finally子句??傊瑹o論如何都會執(zhí)行finally子句。40 of 314.1異?!纠?-13】 try-except-finally語句的執(zhí)行情況分析。第四章 程序控制try:a = eval(input(請輸入a的值:) print(a的倒數(shù)為:

25、, 1 / a)except ZeroDivisionError as e: print(ZeroDivisionError類型錯誤,原因是:,e) finally:#有無異常都要執(zhí)行關(guān)鍵字finally后的語句!print(哈哈,都要執(zhí)行finally!)說明:無論是否捕獲異常,關(guān)鍵字finally后的語句都會被執(zhí)行,仔細觀察以上程序運行后的結(jié)果。41 of 314.1異常(1)沒有發(fā)生異常,執(zhí)行了關(guān)鍵字finally后的語句:第四章 程序控制(2)發(fā)生了一個確定的異常,還是要執(zhí)行關(guān)鍵字finally后的語句,然后再拋出異常:(3)發(fā)生了一個程序員不能確定的異常,但是仍然要執(zhí)行關(guān)鍵字fina

26、lly后的語句,然后拋出異常:42 of 314.1異常8)try-except-else-finally語句其基本語法格式如下:try: except: else: finally:該語句執(zhí)行流程說明:(1) 如果try語句塊沒有發(fā)生異常,則執(zhí)行else和finally子句。(2) 如果try語句塊發(fā)生異常,則先處理異常,然后執(zhí)行finally子句,此時不執(zhí)行else子句。總之,無論如何都會執(zhí)行finally子句。第四章 程序控制43 of 314.1異?!纠?-14】 try-except-else-finally語句的執(zhí)行情況分析。try:a = eval(input(請輸入a的值:)

27、b = eval(input(請輸入b的值:) print(a / b = , a / b)except ZeroDivisionError as e: print(ZeroDivisionError類型錯誤,原因是:,e)except ValueError as e:print(ValueError類型錯誤,原因是:,e) else:#沒有異常才執(zhí)行else子句!print(沒有異常,執(zhí)行else子句! ) finally:#有無異常都要執(zhí)行finally子句!print(嘻嘻,我最大,還是要執(zhí)行finally!)無論是否捕獲異常,關(guān)鍵字finally后的語句都會被執(zhí)行,仔細理解以上程序運行

28、后的輸出信息,將會發(fā)現(xiàn),無論在什么情況下,關(guān)鍵字finally后的語句都會被執(zhí)行。第四章 程序控制44 of 31:4.1異常(1)沒有發(fā)生異常,else子句和finally子句都要執(zhí)行:第四章 程序控制(2)發(fā)生了一個確定的異常,還是要執(zhí)行finally子句,然后再拋出異常:(3)發(fā)生了一個程序員不能確定的異常,但是仍然要執(zhí)行finally子句,然后再拋出異常45 of 314.1異常第四章 程序控制Python異常處理除了try子句和except子句,另外兩個可選的子句else和finally應該放在所有的except子句之后。如果else子句和finally子句同時出現(xiàn),finally子

29、句應該放在最后。finally子句中的代碼一般用于處理無論try子句正常與否都需要執(zhí)行的清理工作,如關(guān)閉數(shù)據(jù)庫連接。示例程序:a = input(請輸入變量a:) try:r = 10 / int(a) print(結(jié)果是:, r)except ValueError as e:print(ValueError類型異常,原因:, e)except ZeroDivisionError as e: print(ZeroDivisionError類型異常,原因:, e)else:print(執(zhí)行了else子句) finally:print(執(zhí)行了finally子句)運行以上程序后根據(jù)輸入數(shù)據(jù)的不同,輸

30、出的信息有所不同。46 of 314.1異常(1)如果變量a的輸入值為abc字符串,則輸出結(jié)果為:第四章 程序控制說明:執(zhí)行int(a)函數(shù)調(diào)用時,傳入了函數(shù)不期望的參數(shù),因此發(fā)生了ValueError類型異常,即使有異常發(fā)生,finally子句也會執(zhí)行。(2)如果輸入a的值為字符串1,輸出的結(jié)果為:說明:try子句正常執(zhí)行,沒有發(fā)生異常,從結(jié)果可以看出,else子句和finally子句都執(zhí)行了。47 of 314.1異常9)raise語句在編程過程中,可以利用Python提供的raise語句拋出異常。使用raise語句時,一般需要應用某種異常類型生成異常實例,如直接使用raise語句會拋出一

31、個指定的異常。對比下面的兩段程序:程序1:第四章 程序控制raise NameError(NameError)程序2:try:raise NameError(NameError) except NameError as e:print(e)48 of 314.1異常#raise語句的使用try:try:a = 1/0except ZeroDivisionError as e: print(內(nèi)層異常:, e)raise#前后對比,理解raise語句的作用except ZeroDivisionError as e:print(外層異常:, e)第四章 程序控制#沒有raise語句try:try:a

32、 = 1/0except ZeroDivisionError as e: print( 內(nèi) 層 異 常 :, e) #raiseexcept ZeroDivisionError as e:print(外層異常:, e)以上兩段代碼表明:內(nèi)層try語句用raise語句將異常原樣拋給外層try語句。raise是關(guān)鍵字,主動觸發(fā)一個錯誤。49 of 56高級大數(shù)據(jù)人才培養(yǎng)4 . 1異常4 . 2斷言4 . 3日志4 . 4調(diào)試器習題第4章程序調(diào)試50 of 314.2斷言第四章 程序控制斷言(assert)是一個調(diào)試工具,用來檢查代碼的正確性。它用來判斷一個條件,如果條件為真,說明斷言成功,則不采取

33、任何措施,即不拋出異常;否則(條件不成立),觸發(fā)AssertionError(斷言錯誤)的異常??梢栽赼ssert后面加任意判斷條件,如果條件為假,說明斷言失敗,則會拋出異常。assert 1 = 1執(zhí)行以上命令無任何輸出 assert 1 = 251 of 314.2斷言第四章 程序控制assert語句的語法格式如下:assert expression , arguments # assert 表達式 , 參數(shù)assert的異常參數(shù)arguments,其實就是在斷言表達式后添加的字符串信息,用來解釋斷言,幫助程序員知道是哪里出了問題。說明:(1)如果省略參數(shù), arguments,當表達式的

34、值為假時,就會拋出AssertionError異常,等同于如下代碼:if not assert_condition:raise AssertionError(2)如果帶有參數(shù), arguments,當表達式的值為假時,由異常參數(shù)arguments來描述異常信息,即由程序員自己給出異常信息。52 of 314.2斷言【例4-15】 assert語句省略參數(shù), arguments 。assert 2=1第四章 程序控制【例4-16】 assert語句省略參數(shù), arguments 。ls = 1,2,3,4,5,6 assert len(ls) = 753 of 314.2斷言【例4-17】 as

35、sert語句省略參數(shù), arguments 。第四章 程序控制assert isinstance(2, int)#這句的條件為真assert isinstance(2, int) #這句的條件為假說明:isinstance(object,classinfo)是Python的一個內(nèi)置函數(shù),用于判斷一個對象是否是一個已知的類型,如果object的類型與classinfo相同,則返回True;否則,返回False。54 of 314.2斷言【例4-18】 帶異常參數(shù)的assert示例。assert 2=1, 2不等于1!第四章 程序控制【例4-19】 帶異常參數(shù)的assert示例。 ls = 1,2

36、,3,4,5,6 assert len(ls) = 7, 列表ls中元素個數(shù)小于7由于條件“l(fā)en(ls) = 7”不成立,所以,拋出了異常。55 of 314.2斷言第四章 程序控制AssertionError異常和其他的異常一樣可以用try-except語句捕獲,但是如果沒有則它將終止程序運行而且提供一個Traceback,例如:獲,#無try-except語句捕獲異常a = input(請輸入一個數(shù)字而非字符串:) b = int(a) * 2print(*2=.format(a,b)56 of 314.2斷言第四章 程序控制【例4-20】 用try-except語句來捕獲異常。要求輸入

37、一個數(shù)值進行運算,如果輸入的是一個非數(shù)值數(shù)據(jù),則拋出異常。a = input(請輸入一個數(shù)字而非字符串:) try:b = int(a) * 2 print(*2=.format(a,b)except Exception as e:print(異常原因是:, e)以上程序也可以通過使用assert語句來實現(xiàn)。57 of 314.2斷言第四章 程序控制【例4-21】 用不帶參數(shù)的assert語句實現(xiàn)。要求輸入一個數(shù)值進行運算,如果輸入的是一個非數(shù)值數(shù)據(jù),則拋出異常。#用來檢查一個條件,如果條件為真,就不做任何處理;如果條件為假,則拋出AssertError異常。a = input(請輸入一個數(shù)字

38、而非字符串:) assert str(a). isdigit()b = int(a) * 2print(*2=.format(a,b)58 of 314.2斷言第四章 程序控制【例4-22】 用帶參數(shù)的assert語句實現(xiàn)。要求輸入一個數(shù)值進行運算,如果輸入的是一個非數(shù)值數(shù)據(jù),則拋出異常,異常信息由程序員自己定義。a = input(請輸入一個數(shù)字而非字符串:)assert str(a).isdigit(),錯了,輸入的是非數(shù)值了!“ b = int(a) * 2print(*2=.format(a,b)運行后的情況分析:(1)輸入數(shù)字3符合要求,沒有出現(xiàn)異常:59 of 314.2斷言第四章

39、 程序控制(2)輸入了一個字母s,不符合要求,拋出了異常,但異常的信息是程序員自己定義的:(3)輸入了一個分號,不符合要求,拋出了異常,但異常的信息是程序員自己定義的:60 of 314.2斷言第四章 程序控制assert語句本身起到了很好的注釋作用,assert語句主要用于以下方面:(1) 防御型的編程。(2) 運行時檢查程序邏輯。(3) 檢查約定。(4) 程序常量。(5) 檢查文檔。61 of 56高級大數(shù)據(jù)人才培養(yǎng)4 . 1異常4 . 2斷言4 . 3日志4 . 4調(diào)試器習題第4章程序調(diào)試62 of 314.3日志第四章 程序控制logging模塊主要分為如下四個部分。(1)Logger

40、:提供日志接口,供應用程序使用。 import logging logging.getLogger()(2) Handler:將Logger產(chǎn)生的日志傳到指定位置。(3) Filter:對輸出日志進行過濾。(4) Formatter:指定日志記錄輸出的具體格式。63 of 314.3日志第四章 程序控制(1) Logger可以包含一個或多個Handler和Filter,即Logger與Handler或Fitler是一對多的關(guān)系。(2) Handler可以包含一個或多個Filter,但只能包含一個Formatter,即Handler與Filter是一對多的關(guān)系,與Formatter是一對一的關(guān)系

41、。(3) Filter可以多次被包含在Logger和Handler中。(4) Formatter只能被包含在Handler中,不能被包含在Logger中,并且只能有一個Formatter被包含在Handler中。64 of 314.3日志第四章 程序控制logging模塊將日志分成五個等級,從低到高分別是:DEBUGINFOWARNINGERRORCRITICAL,如表4-2所示。DEBUG:等級最低,用來打印一些調(diào)試信息。INFO:輸出正常信息,用來打印一些正常的操作。WARNING: 用 來 打 印 警 告 信 息 。 ERROR:用來打印一些錯誤信息。CRITICAL:用來打印一些致命的

42、錯誤信息,等級最高。65 of 314.3日志第四章 程序控制表4-2日志級別級別使 用 描 述DEBUG記錄詳細的信息,調(diào)試代碼時使用INFO確認一切按預期運行WARNING表明發(fā)生了一些意外,或在不久的將來會發(fā)生問題(如磁盤空間低)。程序還在正常運行ERROR由于一些錯誤問題,程序已不能能執(zhí)行一些功能CRITICAL嚴重錯誤,表明程序已不能繼續(xù)運行66 of 314.3日志第四章 程序控制日志的五個等級分別對應五種打印日志的方式:logger.debug()、()、logger.warning()、logger.error()、logger.critical()。默認

43、的輸出等級是WARNING級別,也就是WARNING級別及其以上的日志才會被輸出。如果日志輸出級別設置為DEBUG,則表明所有的日志都將被輸出。67 of 314.3日志第四章 程序控制#logging模塊的使用import logging#設置日志輸出級別為“WARNING”,則只有該級別或以上級別的日志才會被輸出! logging.basicConfig(level=logging.WARNING,format=%(asctime)s - %(filename)sline:%(lineno)d - %(levelname)s:%(message)s)# use logging loggin

44、(this is a loggging info message) logging.debug(this is a loggging debug message) logging.warning(this is loggging a warning message) logging.error(this is an loggging error message)logging.critical(this is a loggging critical message)68 of 314.3日志第四章 程序控制思考:請修改以上程序中的配置代碼分別為:(1)logging.basicCo

45、nfig(level=logging.DEBUG,)(2)如果設置level = logging.INFO然后運行程序觀察輸出的結(jié)果并加以理解。69 of 314.3日志第四章 程序控制在logging.basicConfig()配置函數(shù)中,除了可以配置日志級別,也可以配置日志的輸出格式。日志的輸出格式由參數(shù)format指定,通過設置這個參數(shù)可以輸出很多有用的信息。表4-3列出了常用的format格式。70 of 314.3日志第四章 程序控制表4-3 常用的format格式格式描述%(levelno)s打印代表日志級別的數(shù)值%(levelname)s打印日志級別的名稱(DEBUG、INFO、

46、WARNING、ERROR、CRITICAL)%(pathname)s打印當前執(zhí)行程序的路徑%(filename)s打印當前執(zhí)行程序名%(funcName)s打印日志的當前函數(shù)%(lineno)d打印日志的當前行號(在代碼中所在的行號)%(asctime)s打印日志的時間%(thread)d打印線程ID%(threadName)s打印線程名稱%(process)d打印進程ID%(message)s打印日志信息,如果沒有設置此參數(shù),則日志信息不會輸出(無論是控制臺上還是文件中,都不會有日志信息輸出)71 of 314.3日志第四章 程序控制有兩種方式來記錄跟蹤日志,一種是輸出到控制臺上,另一種是

47、記錄到文件中,形成日志文 件 。 1)將日志輸出到控制臺上#logging模塊的使用import logging#將日志打印到控制臺上logging.debug(debug 信息)#由于默認設置的等級是“WARNING”,所以只有“warning”的信息會輸出到控制臺上!logging.warning(只有這個會輸出)(info 信息)72 of 314.3日志第四章 程序控制可以通過logging.basicConfig()函數(shù)設置打印日志的等級。#logging模塊的使用#使用logging.basicConfig()函數(shù)設置打印日志的等級import loggin

48、g#設置打印日志的級別logging.basicConfig(level=logging.INFO) #將日志打印到控制臺上logging.debug(debug 信 息 ) logging.warning(只有這個會輸出)(info 信息)73 of 314.3日志第四章 程序控制由于輸出日志的級別依次為:DUBUGINFOWARNING,因此,只有“.warning”和“.info”兩個信息將被輸出到控制臺上。logging.basicConfig()函數(shù)實現(xiàn)打印日志的基礎配置,它提供了非常便捷的方式來配置logging模塊,通過傳入不同的參數(shù)實現(xiàn)不同的配置功能。l

49、ogging.basicConfig()函數(shù)的語法格式如下:logging.basicConfig(level=logging.DEBUG, filename=new.log,filemode=a,format= %(asctime)s - %(filename)sline:%(lineno)d - %(levelname)s:%(message)s)74 of 314.3日志第四章 程序控制函數(shù)各參數(shù)的含義如下:level:設置日志級別,默認為logging.WARNING,即WARNING級別。filename:指定日志文件名,日志文件的擴展名為.log。filemode:指定日志文件的打

50、開模式,包括w和a。w為寫模式,其每次都會重新寫日志,覆蓋之前的日志。a為追加模式,filemode默認的就是追加模式。如果在logging.basicConfig()中設置filename和filemode,則只會將日志保存到文件中, 不會輸出到控制臺上。format:指定輸出的格式和內(nèi)容,通過設置format,可以輸出很多有用信息。有關(guān)logging.basicConfig()更詳細的使用可通過命令“help(logging)”進行查閱。 import logging help(logging)75 of 314.3日志第四章 程序控制2)將日志輸出到文件中在logging.basicConfig()函數(shù)中,通過設置輸出文件(.log文件,也可以是.txt文件)的文件名和寫文件的模式(w或a),就能將日志信息寫入日志文件中。但必須注意:如果在logging.basicConfig()函數(shù)中要傳入format參數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論