關(guān)于Python的異常捕獲和處理
程序運(yùn)行過(guò)程中,一旦出現(xiàn)異常將會(huì)導(dǎo)致程序立即終止,異常以后的代碼全部都不會(huì)執(zhí)行!
1 | 語(yǔ)法錯(cuò)誤
指解析代碼時(shí)出現(xiàn)的錯(cuò)誤。當(dāng)代碼不符合Python 語(yǔ)法規(guī)則時(shí),Python解釋器在解析時(shí)就會(huì)報(bào)出 SyntaxError 語(yǔ)法錯(cuò)誤,與此同時(shí)還會(huì)明確指出最早探測(cè)到錯(cuò)誤的語(yǔ)句。例如:
print "Hello,World!"
我們知道,Python 3.0已不再支持上面這種寫法,所以在運(yùn)行時(shí),解釋器會(huì)報(bào)如下錯(cuò)誤:
SyntaxError: Missing parentheses in call to 'print'
語(yǔ)法錯(cuò)誤多是開發(fā)者疏忽導(dǎo)致的,屬于真正意義上的錯(cuò)誤,是解釋器無(wú)法容忍的,因此,只有將程序中的所有語(yǔ)法錯(cuò)誤全部糾正,程序才能執(zhí)行。
2 | 運(yùn)行時(shí)錯(cuò)誤
運(yùn)行時(shí)錯(cuò)誤,即程序在語(yǔ)法上都是正確的,但在運(yùn)行時(shí)發(fā)生了錯(cuò)誤。例如:
a = 1/0
上面這句代碼的意思是“用 1 除以 0,并賦值給 a 。因?yàn)? 作除數(shù)是沒(méi)有意義的,所以運(yùn)行后會(huì)產(chǎn)生如下錯(cuò)誤:
Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: division by zero
3 |其他異常
以上運(yùn)行輸出結(jié)果中,前兩段指明了錯(cuò)誤的位置,最后一句表示出錯(cuò)的類型。在 Python 中,把這種運(yùn)行時(shí)產(chǎn)生錯(cuò)誤的情況叫做異常(Exceptions)。
這種異常情況還有很多,常見的幾種異常情況如下表:
異常類型 | 含義 | 實(shí)例 |
AssertionError | 當(dāng) assert 關(guān)鍵字后的條件為假時(shí),程序運(yùn)行會(huì)停止并拋出此異常 | >>> assert 1>0 >>> assert 1<0 AssertionError |
AttributeError | 當(dāng)試圖訪問(wèn)的對(duì)象屬性不存在時(shí),拋出的異常 | >>> s="hello" >>> s.len AttributeError: 'str' object has no attribute'len' |
IndexError | 索引超出序列范圍,會(huì)引發(fā)此異常 | >>> s="hello" >>> s[5] IndexError: string index out of range |
KeyError | 字典中查找一個(gè)不存在的關(guān)鍵字時(shí),引發(fā)此異常 | >>> demo_dict={"age": 20} >>> demo_dict["name"] KeyError: 'name' |
NameError | 嘗試訪問(wèn)一個(gè)未聲明的變量時(shí),引發(fā)此異常 | >>> hello NameError: name 'hello' is not defined |
TypeError | 不同類型數(shù)據(jù)之間的無(wú)效操作 | >>> 1+"2" TypeError: unsupported operand type(s) for +: 'int' and 'str' |
ZeroDivisionError | 除法運(yùn)算中除數(shù)為 0 引發(fā)此異常 | >>> a = 1/0 ZeroDivisionError: division by zero |
4 | 異常處理
程序運(yùn)行時(shí)出現(xiàn)異常,目的并不是讓我們的程序直接終止!Python是希望在出現(xiàn)異常時(shí),我們可以編寫代碼來(lái)對(duì)異常進(jìn)行處理!
Python 提供了try except語(yǔ)句捕獲并處理異常,該異常處理語(yǔ)句的基本語(yǔ)法結(jié)構(gòu)如下:
try: # 可能產(chǎn)生異常的代碼塊 except [(Error1, Error2, ...) [as e]]: # 處理異常的代碼塊1 except [(Error3, Error4, ...) [as e]]: # 處理異常的代碼塊2
該格式中,[ ] 括起來(lái)的部分可以使用,也可以省略。其中各部分的含義如下:
- (Error1, Error2,...) 、(Error3, Error4,...):其中,Error1、Error2、Error3 和Error4 都是具體的異常類型。顯然,一個(gè) except 塊可以同時(shí)處理多種異常。
- [as e]:作為可選參數(shù),表示給異常類型起一個(gè)別名 e,這樣做的好處是方便在except 塊中調(diào)用異常類型(后續(xù)會(huì)用到)。
- [Exception]:作為可選參數(shù),可以代指程序可能發(fā)生的所有異常情況,其通常用在最后一個(gè) except 塊。
- 注:except 后面也可以不指定具體的異常名稱,這樣的話,表示要捕獲所有類型的異常。
另外,從 try except 的基本語(yǔ)法格式可以看出,try 代碼塊僅有一個(gè),但except 代碼塊可以有多個(gè),這是為了針對(duì)不同的異常類型提供不同的異常處理方式。當(dāng)程序發(fā)生不同的意外情況時(shí),會(huì)對(duì)應(yīng)不同的異常類型,Python 解釋器就會(huì)根據(jù)該異常類型來(lái)決定使用哪個(gè) except 塊來(lái)處理該異常。
try except 語(yǔ)句的執(zhí)行流程如下:
1、首先執(zhí)行 try 中的代碼塊,如果執(zhí)行過(guò)程中出現(xiàn)異常,系統(tǒng)會(huì)自動(dòng)生成一個(gè)異常類型,并將該異常提交給 Python 解釋器,此過(guò)程稱為捕獲異常。
2、當(dāng) Python 解釋器收到異常對(duì)象時(shí),會(huì)尋找能處理該異常對(duì)象的 except 塊,如果找到合適的 except 塊,則把該異常對(duì)象交給該 except 塊處理,這個(gè)過(guò)程被稱為處理異常。如果 Python 解釋器找不到處理異常的 except 塊,則程序運(yùn)行終止,Python 解釋器也將退出。
異常處理例子:
try: a = int(input("輸入被除數(shù):")) b = int(input("輸入除數(shù):")) c = a / b print("您輸入的兩個(gè)數(shù)相除的結(jié)果是:", c ) except (ValueError, ArithmeticError): print("程序發(fā)生了數(shù)字格式異常、算術(shù)異常之一") except : print("未知異常") print("程序繼續(xù)運(yùn)行")
程序運(yùn)行結(jié)果為:
輸入被除數(shù):a程序發(fā)生了數(shù)字格式異常,算術(shù)異常之一程序繼續(xù)運(yùn)行
上面程序中,第 6 行代碼使用了(ValueError, ArithmeticError)來(lái)指定所捕獲的異常類型,這就表明該 except 塊可以同時(shí)捕獲這 2 種類型的異常;第 8 行代碼只有 except 關(guān)鍵字,并未指定具體要捕獲的異常類型,這種省略異常類的 except 語(yǔ)句也是合法的,它表示可捕獲所有類型的異常,一般會(huì)作為異常捕獲的最后一個(gè) except 塊。除此之外,由于 try 塊中引發(fā)了異常,并被 except 塊成功捕獲,因此程序才可以繼續(xù)執(zhí)行,才有了“程序繼續(xù)運(yùn)行”的輸出結(jié)果。
通過(guò)在try塊后提供多個(gè)except塊可以無(wú)須在異常處理塊中使用if判斷異常類型,但依然可以針對(duì)不同的異常類型提供相應(yīng)的處理邏輯,從而提供更細(xì)致、更有條理的異常處理邏輯。
事實(shí)上,不管程序代碼塊是否處于 try 塊中,甚至包括 except 塊中的代碼,只要執(zhí)行該代碼塊時(shí)出現(xiàn)了異常,系統(tǒng)總會(huì)自動(dòng)生成一個(gè) Error 對(duì)象。如果程序沒(méi)有為這段代碼定義任何的 except 塊,則 Python 解釋器無(wú)法找到處理該異常的 except 塊,程序就會(huì)停止運(yùn)行;反之,如果程序發(fā)生異常,并且該異常經(jīng) try 捕獲并由 except 處理完成,則程序會(huì)繼續(xù)執(zhí)行。
5 | 獲取特定異常的有關(guān)信息
每種異常類型都提供了如下幾個(gè)屬性和方法,通過(guò)調(diào)用它們,就可以獲取當(dāng)前處理異常類型的相關(guān)信息:
- args:返回異常的錯(cuò)誤編號(hào)和描述字符串;
- str(e):返回異常信息,但不包括異常信息的類型;
- repr(e):返回較全的異常信息,包括異常信息的類型。
try: result=20/int(input("請(qǐng)輸入除數(shù):")) print(result) except ValueError: print("必須輸入整數(shù)") except ArithmeticError: print("算數(shù)錯(cuò)誤,除數(shù)不能為 0") else: print("沒(méi)有出現(xiàn)異常") print("繼續(xù)運(yùn)行")
程序運(yùn)行結(jié)果為:
輸入被除數(shù):210沒(méi)有出現(xiàn)異常繼續(xù)運(yùn)行
6 |finally語(yǔ)句
Python 異常處理機(jī)制還提供了一個(gè) finally 語(yǔ)句,用來(lái)為 try 塊中的程序做掃尾清理工作。
在整個(gè)異常處理機(jī)制中,finally 語(yǔ)句的功能是:無(wú)論 try 塊是否發(fā)生異常,最終都要進(jìn)入 finally 語(yǔ)句,并執(zhí)行其中的代碼塊。
finally 示例:
try: a=20/int(input("請(qǐng)輸入 a 的值:")) print(a) except: print("發(fā)生異常") else: print("執(zhí)行 else 代碼塊") finally: print("執(zhí)行 finally 代碼塊")
finally 代碼塊的強(qiáng)大還遠(yuǎn)不止此,即便當(dāng) try 塊發(fā)生異常,且沒(méi)有合適和except 處理異常時(shí),finally 塊中的代碼也會(huì)得到執(zhí)行。
到此這篇關(guān)于關(guān)于Python的異常捕獲和處理的文章就介紹到這了,更多相關(guān)Python異常捕獲處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python常用request庫(kù)與lxml庫(kù)操作方法整理總結(jié)
一路學(xué)習(xí),一路總結(jié),技術(shù)就是這樣,應(yīng)用之后,在進(jìn)行整理,才可以加深印象。本篇文字為小節(jié)篇,核心總結(jié) requests 庫(kù)與 lxml 庫(kù)常用的操作2021-08-08python 動(dòng)態(tài)生成變量名以及動(dòng)態(tài)獲取變量的變量名方法
今天小編就為大家分享一篇python 動(dòng)態(tài)生成變量名以及動(dòng)態(tài)獲取變量的變量名方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python+redis通過(guò)限流保護(hù)高并發(fā)系統(tǒng)
這篇文章主要介紹了Python+redis通過(guò)限流保護(hù)高并發(fā)系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04PyCharm+PySpark遠(yuǎn)程調(diào)試的環(huán)境配置的方法
今天小編就為大家分享一篇PyCharm+PySpark遠(yuǎn)程調(diào)試的環(huán)境配置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11顯卡驅(qū)動(dòng)CUDA?和?pytorch?CUDA?之間的區(qū)別
本文主要介紹了顯卡驅(qū)動(dòng)CUDA?和?pytorch?CUDA?之間的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python中torch可以成功引用但無(wú)法訪問(wèn)屬性的解決辦法
這篇文章給大家介紹了我們?cè)趐ython中運(yùn)行程序時(shí)遇到一個(gè)奇怪的報(bào)錯(cuò),torch可以成功引用但無(wú)法訪問(wèn)屬性,這是比較奇怪的一件事,因?yàn)閠orch肯定是可以訪問(wèn)Tensor,所以本文給大家介紹了torch可以成功引用但無(wú)法訪問(wèn)屬性的解決辦法,需要的朋友可以參考下2024-01-01Python count()函數(shù)實(shí)例詳解
count() 是Python的內(nèi)置函數(shù),可以「統(tǒng)計(jì)」字符串里指定「字符」或指定字符串出現(xiàn)的「次數(shù)」,這篇文章主要介紹了Python count()函數(shù)詳解,需要的朋友可以參考下2023-07-07對(duì)numpy.append()里的axis的用法詳解
今天小編就為大家分享一篇對(duì)numpy.append()里的axis的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06