Python基礎(chǔ)入門(mén)教程28:企業(yè)級(jí)開(kāi)發(fā)基礎(chǔ) 異常處理
來(lái)源:
奇酷教育 發(fā)表於:
2017-06-23 17:22:08
本節(jié)內(nèi)容如下:什麼是異常,對(duì)異常的解釋和描述,口語描述和專(zhuān)業(yè)術(shù)語的聯(lián)繫代碼中出現(xiàn)錯誤的處理手段異常處理方式什麼樣的情況算異常捕獲異
本節(jié)內(nèi)容如下:
什麼是異常,對(duì)異常的解釋和描述,口語描述和專(zhuān)業(yè)術(shù)語的聯(lián)繫
代碼中出現(xiàn)錯誤的處理手段
異常處理方式
什麼樣的情況算異常
捕獲異常【try-except-else-finally】
拋出異常【raise】
常見(jiàn)異常
1. 什麼是異常
我們程序在開(kāi)發(fā)過(guò)程中,總會(huì)遇到各種各樣的一些問(wèn)題,有些是由於拼寫(xiě)、配置、選項(xiàng)等等各種引起的程序錯誤,有些是由於程序功能處理邏輯不完善引起的漏洞,這些統(tǒng)稱(chēng)為我們程序中的異常
所謂異常:就是不正常的情況,錯誤和漏洞都是不正常的情況,異常情況有時(shí)候也會(huì)稱(chēng)呼為BUG,也就是缺陷、漏洞的意思,程序執(zhí)行過(guò)程中出現(xiàn)異常會(huì)影響程序的正常執(zhí)行。
python中內(nèi)置了一整套完善的異常處理機(jī)制,可以讓開(kāi)發(fā)人員快速針對(duì)出現(xiàn)問(wèn)題的代碼進(jìn)行完善和處理。
我們針對(duì)python可能遇到的不同的異常情況,一般會(huì)做如下處理:
如果是拼寫(xiě)、配置等等引起的錯誤,根據(jù)出錯信息進(jìn)行排查錯誤出現(xiàn)的位置進(jìn)行解決
如果是程序設(shè)計(jì)不完善引起的漏洞,根據(jù)漏洞的情況進(jìn)行設(shè)計(jì)處理漏洞的邏輯;
切記:合理的處理BUG也是程序設(shè)計(jì)開(kāi)發(fā)的一部分
2. 錯誤處理
錯誤的出現(xiàn),在程序中一般會(huì)有兩(liǎng)種表現(xiàn),一種是拼寫(xiě)錯誤,一種是程序執(zhí)行過(guò)程中出現(xiàn)的錯誤,這樣兩(liǎng)種不同的錯誤應(yīng)該怎麼進(jìn)行追蹤和處理呢?
2.1. 拼寫(xiě)錯誤
常規(guī)情況下,拼寫(xiě)錯誤只是在簡(jiǎn)單的記事本等環(huán)境下進(jìn)行開(kāi)發(fā)時(shí),容易手誤產(chǎn)生拼寫(xiě)錯誤;當(dāng)前開(kāi)發(fā)環(huán)境下,我們經(jīng)常使用一些半自動(dòng)化的IDE開(kāi)發(fā)工具,如pycharm等等,可以進(jìn)行簡(jiǎn)單的程序關(guān)鍵字的拼寫(xiě)檢查以及程序結(jié)構(gòu )的檢查,把一些簡(jiǎn)單的拼寫(xiě)問(wèn)題掐死在萌芽之中
程序設(shè)計(jì)開(kāi)發(fā)的學(xué)習(xí)需要經(jīng)歷一個(gè)過(guò)程,建議開(kāi)始的基礎(chǔ)部分使用超級(jí)記事本進(jìn)行開(kāi)發(fā),如editplus、ultraedit、sublime等等,對(duì)於基礎(chǔ)的掌握會(huì)有一個(gè)非常不錯的提升作用;進(jìn)入後續(xù)的企業(yè)級(jí)項(xiàng)目開(kāi)發(fā)階段之後可以使用高級(jí)開(kāi)發(fā)工具來(lái)提升我們的開(kāi)發(fā)效率,如Pycharm、eclipse等等。
2.2. 程序運(yùn)行時(shí)錯誤
程序運(yùn)行過(guò)程中,也會(huì)出現(xiàn)各種各樣的錯誤,對(duì)於錯誤的出現(xiàn)和提示信息必須有一個(gè)比較明確的掌握,才能在後續(xù)的程序開(kāi)發(fā)中快速的開(kāi)發(fā)並且修復問(wèn)題,這裡就會(huì)出現(xiàn)兩(liǎng)個(gè)步驟
確定問(wèn)題及問(wèn)題出現(xiàn)的代碼行
後續(xù)的問(wèn)題處理【參考後面的異常處理】
首先我們必須查詢問(wèn)題出現(xiàn)的錯誤提示信息,觀(guān)察如下代碼
運(yùn)行結(jié)果中出現(xiàn)了錯誤,錯誤的名稱(chēng)是AttributeError,錯誤的提示是'Person' object has no attribute '_Person__names',簡(jiǎn)單翻譯過(guò)來(lái)就是在Person對(duì)象中沒有屬性_Person__names
僅僅依靠這樣的錯誤提示,我們已經(jīng)了解到,可能是我們對(duì)象的屬性操作過(guò)程中出現(xiàn)了什麼錯誤,到底出現(xiàn)了什麼錯誤呢?繼續(xù)觀(guān)察上面的錯誤代碼:
從錯誤的第一行代碼
3.1. 代碼中什麼樣的情況是異常?
python提供了一套try-except-finally的異常處理代碼塊,用於針對(duì)可能出現(xiàn)問(wèn)題的代碼進(jìn)行容錯和處理
異常處理的語法結(jié)構(gòu )如下:
上述功能的程序設(shè)計(jì)時(shí),已經(jīng)考慮了諸多的問(wèn)題,如用戶(hù)輸(shū)入的數(shù)據(jù)應(yīng)該是字符串,代碼中通過(guò)int()方法進(jìn)行了強(qiáng)制類(lèi)型轉(zhuǎn)換(huàn),在最後輸(shū)出數(shù)據(jù)的時(shí)候,由於num3是數(shù)值,數(shù)值和字符串不能直接用符號(hào)+連接,所以對(duì)num3又通過(guò)str()函數(shù)強(qiáng)制轉(zhuǎn)換(huàn)成了字符串。正常情況下,程序沒有任何問(wèn)題。
但是~上述程序的缺陷並非正常流程下,而是~如果用戶(hù)在應(yīng)該輸(shū)入數(shù)字的情況下,輸(shū)入了字母或者其他的非數(shù)字字符,程序就出現(xiàn)錯誤了,這個(gè)才是我們要解決的程序的BUG
可以看到,上面通過(guò)添加try-except這樣的一個(gè)代碼塊,完美的解決了我們出現(xiàn)的錯誤,不至於讓錯誤導(dǎo )致程序的崩潰
3.2. 異常處理的方式1——捕獲異常
異常處理,python中是通過(guò)try-except語句代碼塊來(lái)執(zhí)行處理的
try-except語句代碼塊處理異常通常有這樣幾種方式
使用try-except直接包含並處理所有異常
4.使用try-except-except-finally處理異常並在finally中進(jìn)行後續(xù)處理
3.2. 異常處理的方式2——拋出異常
某些情況下,我們捕獲到異常信息,如果只是簡(jiǎn)單的進(jìn)行處理,對(duì)後續(xù)的程序可能會(huì)造成一定的困擾,舉一個(gè)簡(jiǎn)單的操作案例:老闆讓員工老李去採購(gòu)一批辦公用品
請觀(guān)察我們之前寫(xiě)過(guò)的如下代碼:
3.3. 異常處理的方式3——拋出自定義異常
如果系統(tǒng)提供的異常不一定符合我們的需要,如用戶(hù)登錄失敗,需要提示一個(gè)帳號(hào)密碼有誤的異常信息,python中是沒有提供這樣的異常對(duì)象的,需要開(kāi)發(fā)人員自定義異常來(lái)進(jìn)行處理
我們從前面的內(nèi)容中已經(jīng)知道,所有的異常對(duì)象都是直接或者間接繼承自BaseException
所以自定義異常如下:
4. 常見(jiàn)的異常
>>>更多VR/AR入門(mén)教程:VR入門(mén)