Python 異常處理總結(jié)
異常處理對(duì)于創(chuàng)建健壯和穩(wěn)定的應(yīng)用程序非常重要。它鼓勵(lì)程序員編寫(xiě)干凈、可讀和無(wú)錯(cuò)誤的代碼。
您會(huì)同意,即使是最好的代碼也可能在運(yùn)行時(shí)出現(xiàn)意外行為。這可能是由于缺少配置,或者執(zhí)行環(huán)境發(fā)生了變化,或者用戶輸入了錯(cuò)誤的輸入。
其中一些錯(cuò)誤可能會(huì)導(dǎo)致程序突然終止。在 Python
異常處理的幫助下,我們可以管理上述問(wèn)題并避免我們的代碼間歇性失敗。
首先,我們必須了解錯(cuò)誤和異常之間的區(qū)別。因此,我們將教您 Python
異常處理的基本知識(shí)。
一、Python 異常處理:錯(cuò)誤與異常
1、什么是錯(cuò)誤?
錯(cuò)誤是程序中出現(xiàn)的錯(cuò)誤,例如語(yǔ)法錯(cuò)誤。
它發(fā)生在編譯時(shí)。讓我們看一個(gè)例子。
if a<5 File "<interactive input>", line 1 if a < 5 ^ SyntaxError: invalid syntax
2、什么是異常?
錯(cuò)誤也會(huì)在運(yùn)行時(shí)發(fā)生,我們將它們稱為異常。異常是在程序執(zhí)行期間發(fā)生并中斷程序指令正常流程的事件。
通常,當(dāng) Python
腳本遇到它無(wú)法處理的錯(cuò)誤情況時(shí),它會(huì)引發(fā)異常。
當(dāng) Python
腳本引發(fā)異常時(shí),它會(huì)創(chuàng)建一個(gè)異常對(duì)象。
通常,腳本會(huì)立即處理異常。如果它不這樣做,那么程序?qū)⒔K止并打印對(duì)錯(cuò)誤的追溯及其下落。
>>> 1 / 0 Traceback (most recent call last): File "<string>", line 301, in run code File "<interactive input>", line 1, in <module> ZeroDivisionError: division by zero
二、如何使用 Try-Except 處理異常?
1、什么是 Try-Except 語(yǔ)句?
我們使用 try-except
語(yǔ)句在 Python
程序中啟用異常處理。
在 try
塊中,您編寫(xiě)可以引發(fā)異常的代碼。
而處理或捕獲異常的代碼,我們放在except
子句中。
2、Python 異常處理語(yǔ)法
以下是Python try-except-else
塊的語(yǔ)法。
try: 你在這里做你的操作; ...................... except ExceptionI: 如果有 ExceptionI,則執(zhí)行此塊 except ExceptionII: 如果有 ExceptionII,則執(zhí)行此塊 ...................... else: 如果沒(méi)有異常則執(zhí)行此塊。
看一看 – 30 個(gè) Python 教程和技巧
這是有效使用 Python try
語(yǔ)句的清單。
- 根據(jù)需求,單個(gè)
try
語(yǔ)句可以有多個(gè)except
語(yǔ)句。在這種情況下,try
塊包含可以拋出不同類(lèi)型異常的語(yǔ)句。 - 我們還可以添加一個(gè)通用的
except
子句,它可以處理所有可能的異常類(lèi)型。 - 我們甚至可以在
except
子句之后包含一個(gè)else
子句。如果try
塊中的代碼沒(méi)有引發(fā)異常,則 else 塊中的指令將執(zhí)行。
3、Python 異常處理示例
讓我們通過(guò)一個(gè)示例代碼來(lái)了解 Python try-except
的使用。
try: fob = open("test", "w") fob.write("這是我的異常處理測(cè)試文件") except IOError: print "錯(cuò)誤:找不到文件或讀取數(shù)據(jù)" else: print "對(duì)文件執(zhí)行寫(xiě)操作成功" fob.close()
上面的代碼產(chǎn)生以下輸出。
>>對(duì)文件執(zhí)行寫(xiě)操作成功
讓我們?cè)倥e一個(gè)例子,在這個(gè)例子中我們?cè)噲D以 READ 模式打開(kāi)一個(gè)文件。
我們將對(duì)其執(zhí)行 WRITE 操作。執(zhí)行時(shí)會(huì)拋出異常。
try: fob = open("test", "r") fob.write("這是我的測(cè)試文件,用于驗(yàn)證 Python 中的異常處理") except IOError: print "錯(cuò)誤:找不到文件或讀取數(shù)據(jù)" else: print "對(duì)文件執(zhí)行寫(xiě)操作成功"
上面的代碼產(chǎn)生以下輸出。
>>錯(cuò)誤:找不到文件或讀取數(shù)據(jù)
三、用 Except 處理所有類(lèi)型的異常
如果我們使用一個(gè)空的 “except
” 子句,那么它將捕獲所有類(lèi)型的異常。
然而,這既不是一個(gè)好的編程習(xí)慣,也沒(méi)有人推薦它。
這是因?yàn)檫@樣的 Python try-except
塊可以處理所有類(lèi)型的異常。但是它不會(huì)幫助程序員找到導(dǎo)致問(wèn)題的異常。
您可以通過(guò)以下代碼查看如何捕獲所有異常。
1、例子
try: 你在這里做你的操作; ...................... except: 如果有任何異常,則執(zhí)行此塊 ...................... else: 如果沒(méi)有異常則執(zhí)行此塊
四、用 except 處理多個(gè)異常
我們可以使用相同的 except
子句定義多個(gè)異常。這意味著如果 Python
解釋器找到匹配的異常,那么它將執(zhí)行在 except
子句下編寫(xiě)的代碼。
簡(jiǎn)而言之,當(dāng)我們這樣定義except
子句時(shí),我們期望同一段代碼拋出不同的異常。此外,我們希望在每種情況下都采取相同的行動(dòng)。
請(qǐng)參考下面的例子。
1、例子
try: 你在這里做你的操作; ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 如果給定的異常列表中有任何異常, 然后執(zhí)行這個(gè)塊 ...................... else: 如果沒(méi)有異常則執(zhí)行此塊
五、如何使用 Try-Finally 處理異常?
1、什么是 Try-Finally 語(yǔ)句?
我們還可以借助 try-finally
語(yǔ)句啟用 Python
異常處理。
使用 try
塊,我們還可以選擇定義“ finally
”塊。該子句允許定義我們想要執(zhí)行的語(yǔ)句,無(wú)論 try 塊是否引發(fā)異常。
此功能通常在釋放外部資源時(shí)出現(xiàn)。
這是幫助的編碼片段。
try: 你在這里做你的操作; ...................... 由于任何異常,這可能會(huì)被跳過(guò) finally: 這將始終被執(zhí)行 ......................
2、例子
一個(gè)關(guān)鍵點(diǎn)是我們可以為每個(gè) try 塊定義一個(gè)“ except
”或“ finally
”子句。你不能把這些放在一起。此外,您不應(yīng)將“ else ”子句與“ finally
”子句一起使用。
讓我們舉一個(gè)例子來(lái)更清楚。
try: fob = open('test', 'w') fob.write("這是我在異常處理中驗(yàn)證 try-finally 的測(cè)試文件") print 'try 塊執(zhí)行' finally: fob.close() print 'finally 塊執(zhí)行'
如果未發(fā)生異常,則您將看到以下輸出。
>>try 塊執(zhí)行
>>finally 塊執(zhí)行
假設(shè)我們以READ模式打開(kāi)文件,然后嘗試對(duì)其執(zhí)行寫(xiě)操作。在這種情況下,下面的代碼將有助于處理異常。
try: fob = open('test', 'r') try: fob.write("這是我在異常處理中驗(yàn)證 try-finally 的測(cè)試文件") print 'try 塊執(zhí)行' finally: fob.close() print 'finally 塊執(zhí)行以關(guān)閉文件' except IOError: print "錯(cuò)誤:找不到文件或讀取數(shù)據(jù)"
在這種情況下,解釋器將引發(fā)異常,并顯示以下輸出。
>>finally 塊執(zhí)行以關(guān)閉文件
>>錯(cuò)誤:找不到文件或讀取數(shù)據(jù)
當(dāng)某些代碼在 try 塊中引起異常時(shí),執(zhí)行會(huì)立即傳遞到“ finally
”塊?!?finally
”塊中的語(yǔ)句全部執(zhí)行完畢后,異?;謴?fù)到“ except
”塊執(zhí)行。但是必須存在“ try-except
”語(yǔ)句的下一個(gè)更高層。
六、用參數(shù)引發(fā)異常
1、什么是提升?
我們可以使用 raise
關(guān)鍵字強(qiáng)制引發(fā)異常。
我們還可以選擇將值傳遞給異常并指定它發(fā)生的原因。
2、提升語(yǔ)法
這是調(diào)用“ raise
”方法的語(yǔ)法。
raise [Exception [, args [, traceback]]]
在哪里,
- 在 “
Exception
”下- 指定其名稱。 - “
args
”是可選的,表示異常參數(shù)的值。 - 最后一個(gè)參數(shù) “
traceback
” 也是可選的,如果存在,則是用于異常的回溯對(duì)象。
讓我們舉一個(gè)例子來(lái)證明這一點(diǎn)。
3、加注示例
>>> raise MemoryError Traceback (most recent call last): ... MemoryError >>> raise MemoryError("This is an argument") Traceback (most recent call last): ... MemoryError: This is an argument >>> try: a = int(input("Enter a positive integer value: ")) if a <= 0: raise ValueError("This is not a positive number!!") except ValueError as ve: print(ve) Following Output is displayed if we enter a negative number: Enter a positive integer: –5 This is not a positive number!!
七、在 Python 中創(chuàng)建自定義異常
1、什么是自定義異常?
自定義異常是程序員自己創(chuàng)建的異常。
他通過(guò)添加一個(gè)新類(lèi)來(lái)做到這一點(diǎn)。這里的技巧是從基本異常類(lèi)派生自定義異常類(lèi)。
大多數(shù)內(nèi)置異常也有相應(yīng)的類(lèi)。
2、在 Python 中創(chuàng)建異常類(lèi)
>>> class UserDefinedError(Exception): ... pass >>> raise UserDefinedError Traceback (most recent call last): ... __main__.UserDefinedError >>> raise UserDefinedError("An error occurred") Traceback (most recent call last): ... __main__.UserDefinedError: An error occurred
在上面的代碼片段中,您可以看到我們創(chuàng)建了一個(gè)用戶定義的異常類(lèi),“ UserDefinedError
” 。它使用基 Exception
類(lèi)作為父類(lèi)。因此,新的用戶定義異常類(lèi)將像任何其他異常類(lèi)一樣引發(fā)異常,即通過(guò)調(diào)用帶有可選錯(cuò)誤消息的“ raise
”語(yǔ)句。
讓我們舉個(gè)例子。
3、例子
在此示例中,我們將展示如何在程序中引發(fā)用戶定義的異常并捕獲錯(cuò)誤。
該程序提示用戶一次又一次地輸入字母表,直到他只輸入存儲(chǔ)的字母表為止。
為了尋求幫助,該程序會(huì)向用戶提供提示,以便他可以找出正確的字母表。此外,他可以檢查他的猜測(cè)是否高于或低于存儲(chǔ)的字母表。
#定義 Python 用戶定義的異常 class Error(Exception): """Base class for other exceptions""" pass class InputTooSmallError(Error): """Raised when the entered alpahbet is smaller than the actual one""" pass class InputTooLargeError(Error): """Raised when the entered alpahbet is larger than the actual one""" pass #我們的主程序 #用戶猜測(cè)一個(gè)字母,直到他/她猜對(duì)了 #你需要猜這個(gè)字母 alphabet = 'm' while True: try: apb = input("輸入一個(gè)字母: ") if apb < alphabet: raise InputTooSmallError elif apb > alphabet: raise InputTooLargeError break except InputTooSmallError: print("輸入的字母太小,再試一遍!") print('') except InputTooLargeError: print("輸入的字母太大,再試一遍!") print('') print("恭喜! 你猜對(duì)了")
讓我們通過(guò)提供不同的輸入來(lái)測(cè)試這個(gè)程序。
輸入一個(gè)字母:c 輸入的字母太小,再試一遍! 輸入一個(gè)字母:s 輸入的字母太大,再試一遍! 輸入一個(gè)字母:q 輸入的字母太大,再試一遍! 輸入一個(gè)字母:k 輸入的字母太小,再試一遍! 輸入一個(gè)字母:m 恭喜! 你猜對(duì)了
因此你可以看到我們?cè)谶@個(gè)程序中定義了一個(gè)名為 Error 的基類(lèi)。它引發(fā)了從基類(lèi)派生的兩個(gè)異常(“ InputTooSmallError
”和“ InputTooLargeError
”)。這是在 Python
編程中定義用戶定義異常的標(biāo)準(zhǔn)方法。
4、Python 內(nèi)置異常


八、總結(jié)——Python異常處理概念
大多數(shù)時(shí)候,我的目標(biāo)是發(fā)現(xiàn)一個(gè)可以幫助讀者工作的主題。這就是我們介紹本篇關(guān)于 Python
異常處理的原因。如果您喜歡這篇文章并有興趣看到更多此類(lèi)文章,可以看看這里(Github/Gitee
) 關(guān)注我以查看更多信息,這里匯總了我的全部原創(chuàng)及作品源碼
到此這篇關(guān)于Python 異常處理詳情的文章就介紹到這了,更多相關(guān)Python 異常處理內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。