Python中的错误处理
錯(cuò)誤處理是計(jì)算機(jī)科學(xué)中最重要的概念之一,它將通過(guò)處理導(dǎo)致程序退出的意外錯(cuò)誤來(lái)幫助您提高代碼的健壯性。
在本教程中,我們將學(xué)習(xí)如何在Python中處理異常。我們將涵蓋以下主題:
- 錯(cuò)誤與異常
- Python中的內(nèi)置異常
- 沒(méi)有處理異常的問(wèn)題
- 處理異常
- 具有多個(gè)異常的除外子句
- 最后清理使用
- 自定義例外
可能有兩種錯(cuò)誤:
1.語(yǔ)法錯(cuò)誤
2.異常(運(yùn)行時(shí)遇到的錯(cuò)誤)
語(yǔ)法錯(cuò)誤
這是你在你的程序看,通常是因?yàn)樵谝粋€(gè)錯(cuò)誤的最常見(jiàn)的錯(cuò)誤空白,一個(gè)錯(cuò)誤的語(yǔ)法,或者簡(jiǎn)單的拼寫(xiě)錯(cuò)誤。如果您的程序在語(yǔ)法上不正確,例如下面給出的代碼中的(?,并且解析器將指向使用小箭頭檢測(cè)到錯(cuò)誤的行,則會(huì)發(fā)生此類(lèi)錯(cuò)誤。
>>> if a > 5File "<stdin>", line 1if a > 5^ SyntaxError: invalid syntax例外:
即使語(yǔ)法正確,也可能導(dǎo)致錯(cuò)誤,我們稱之為錯(cuò)誤異常,Python中有許多不同類(lèi)型的異常,例如下面示例中的ValueError。
>>> a = "hello" >>> int(a) Traceback (most recent call last):File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'hello'如果未正確處理異常,則可能導(dǎo)致程序意外停止。
Python中的內(nèi)置異常
Python有許多有用的內(nèi)置異常,您可能在編程時(shí)遇到這些異常。您將遇到的一些更常見(jiàn)的是:
AttributeError -在屬性賦值或引用失敗時(shí)引發(fā)。
ImportError -Raised未找到導(dǎo)入的模塊。
IndexError - 當(dāng)序列的索引超出范圍時(shí)引發(fā)。
KeyError - 在字典中找不到鍵時(shí)引發(fā)。
KeyboardInterrupt - 當(dāng)用戶點(diǎn)擊中斷鍵(Ctrl + c或刪除)時(shí)增加。
NameError - 在本地或全局范圍內(nèi)找不到變量時(shí)引發(fā)。
**SyntaxError **- 遇到語(yǔ)法錯(cuò)誤時(shí)由解析器引發(fā)。
**IndentationError **- 在縮進(jìn)不正確時(shí)引發(fā)。
ValueError - 當(dāng)函數(shù)獲取正確類(lèi)型但值不正確的參數(shù)時(shí)引發(fā)。
ZeroDivisionError:當(dāng)數(shù)字除以零時(shí)引發(fā)。
沒(méi)有處理異常的問(wèn)題
例外是暫停程序執(zhí)行的條件,如果處理不當(dāng),可能會(huì)導(dǎo)致很多問(wèn)題。考慮以下簡(jiǎn)單示例:
>>> def divide_my_number(num1, num2): ... result = num1 / num2 ... print(f"num1/num2 gives {result}")讓我們用不同的值來(lái)調(diào)用這個(gè)函數(shù)。請(qǐng)注意,我們不會(huì)在此處理任何異常:
>>> divide_my_number(10,2) num1/num2 gives 5.0讓我們將其除以零并仔細(xì)觀察它會(huì)拋出的錯(cuò)誤:
>>> divide_my_number(10,0) Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<stdin>", line 2, in divide_my_number ZeroDivisionError: division by zero我們可以看到程序沒(méi)有成功執(zhí)行并返回了一個(gè)異常,可以正常處理以避免這種停頓。
零分割是一種常見(jiàn)的情況,我們可以有很多場(chǎng)景,我們不希望我們的程序意外停止,例如處理文件,API或任何我們不希望我們的用戶使用的真實(shí)應(yīng)用程序時(shí)看到這些奇怪的錯(cuò)誤。
一旦我們將學(xué)習(xí)所有概念,我們將看到如何在函數(shù)(divide_my_number)中處理此異常。
python中的異常處理
異常處理提供了一種機(jī)制來(lái)處理代碼的典型控制流中的錯(cuò)誤或其他異常情況。
許多語(yǔ)言都有“Try-catch”塊的概念。Python使用四個(gè)關(guān)鍵字:Try,Except,Else, Finally
可能引發(fā)異常的代碼將進(jìn)入Try塊
如果引發(fā)異常,則Except塊內(nèi)的代碼將運(yùn)行
Else是一個(gè)可選塊,當(dāng)程序中沒(méi)有異常時(shí)會(huì)引發(fā)該塊
最后是一個(gè)可選塊,它將在最后運(yùn)行,無(wú)論是否引發(fā)異常。
讓我們看一下下面的圖片,以便更清晰
一個(gè)基本的例子如下所示:
首先,執(zhí)行try語(yǔ)句。如果沒(méi)有異常,那么try語(yǔ)句將完成運(yùn)行try塊內(nèi)的所有內(nèi)容。如果try塊中發(fā)生異常,則跳過(guò)行的其余部分,如果異常類(lèi)型與except中提供的名稱匹配,則將執(zhí)行except子句(如上面代碼中的ValueError)。如果異常與任何特定名稱不匹配,則執(zhí)行將停止。
捕獲Python中的特定異常
一個(gè)except子句可能有多個(gè)異常,我們可以將它作為元組傳遞。
>>> try: ... num = int(input("Enter a number: ")) ... except (ValueError, RuntimeError, TypeError, NameError): ... print("Please enter a valid number") ... Enter a number: 6s Please enter a valid number除了也可以單獨(dú)處理所有這些
>>> try: ... num = int(input("Enter a number: ")) ... except ValueError: ... print("Please enter a valid number")except NameError:print("Please check your number once again")Enter a number: 6s Please enter a valid number清理使用 finally
想象一下,您總是需要清理一些代碼,例如關(guān)閉文件。最后是一個(gè)可選塊,它將在最后運(yùn)行,無(wú)論是否拋出異常。
>>> try: ... num = int(input("Enter a number: ")) ... except ValueError: ... print("Please enter a valid number") ... else: ... print("I will run if no exception is thrown") ... finally: ... print("I will run no matter what will happen!!") ... Enter a number: 9s Please enter a valid number I will run no matter what will happen!!如您所見(jiàn),即使發(fā)生異常,最終塊也會(huì)被打印出來(lái)。
提高例外
該加薪語(yǔ)句允許程序員強(qiáng)制指定的異常發(fā)生。例如:
>>> def numbers_less_than_five(num): ... if num > 5: ... raise ValueError ... else: ... print(f"Number entered is {num}") ...>>> numbers_less_than_five(4) Number entered is 4 >>> numbers_less_than_five(8) Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<stdin>", line 3, in numbers_less_than_five ValueError如果您想了解有關(guān)異常的更多信息,請(qǐng)查看官方文檔8.錯(cuò)誤和例外
自定義例外
Python有許多內(nèi)置的Exception,但有時(shí)我們需要根據(jù)我們的用例定義自己的異常。
在Python中,我們可以通過(guò)繼承Exception類(lèi)來(lái)創(chuàng)建一個(gè)新類(lèi),如下例所示。
>>> class MyException(Exception): ... # Write your logic here ... pass ...我們可以使用raise關(guān)鍵字提出自己的自定義異常
>>> raise MyException() Traceback (most recent call last):File "<stdin>", line 1, in <module> __main__.MyException >>>按照承諾,讓我們使用我們學(xué)到的所有概念來(lái)處理函數(shù)divide_my_number
>>> def divide_my_number(num1, num2): ... try: ... result = num1 / num2 ... print(f"num1/num2 gives {result}") ... except TypeError: ... print("Number should be Integer") ... except ValueError: ... print("Please Enter a valid integer") ... except ZeroDivisionError: ... print("Divided by zero is not possible") ... else: ... print("Program got executed successfully, No exception raised")讓我們嘗試所有邊緣情況,看看我們的函數(shù)如何表現(xiàn)
>>> divide_my_number(10,5) num1/num2 gives 2.0 Program got executed successfully, No exception raised# When one of the parameters is a string >>> divide_my_number(10,"s") Number should be Integer>>> divide_my_number(10,0) Divided by zero is not possible很少有最佳實(shí)踐可以捕獲特定的異常,這有助于您的程序在異常處理方面更加強(qiáng)大。
結(jié)論
我們了解了使用raise,try和except來(lái)處理異常的各種方法。我們還學(xué)到了各種各樣的概念
- 在該try子句中,將執(zhí)行所有語(yǔ)句,直到遇到異常。
- except 用于處理try塊中引發(fā)的異常。
- else 只有在try子句中沒(méi)有遇到異常時(shí),塊才會(huì)運(yùn)行
- finally 使您能夠執(zhí)行應(yīng)該始終運(yùn)行的代碼段,而不管是否引發(fā)異常。
- raise 允許您在程序的任何時(shí)候拋出異常。
- 我們可以創(chuàng)建自己的異常類(lèi),并根據(jù)自己的需要進(jìn)行提升。
- 希望本文能幫助您理解Python中異常處理的概念。
請(qǐng)繼續(xù)關(guān)注這樣的更多教程。
總結(jié)
以上是生活随笔為你收集整理的Python中的错误处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: FreeEIM 2013 SDK 部分源
- 下一篇: 我的心无法平静python好学吗