錯誤處理是計(jì)算機(jī)科學(xué)中最重要的概念之一,它將通過處理導(dǎo)致程序退出的意外錯誤來幫助您提高代碼的健壯性。
在本教程中,我們將學(xué)習(xí)如何在Python中處理異常。我們將涵蓋以下主題:
- 錯誤與異常
- Python中的內(nèi)置異常
- 沒有處理異常的問題
- 處理異常
- 具有多個異常的除外子句
- 最后清理使用
- 自定義例外
可能有兩種錯誤:
1.語法錯誤
2.異常(運(yùn)行時遇到的錯誤)
語法錯誤
這是你在你的程序看,通常是因?yàn)樵谝粋€錯誤的最常見的錯誤空白,一個錯誤的語法,或者簡單的拼寫錯誤。如果您的程序在語法上不正確,例如下面給出的代碼中的(,并且解析器將指向使用小箭頭檢測到錯誤的行,則會發(fā)生此類錯誤。
>>> if a > 5
File "
", line 1
if a > 5
^
SyntaxError: invalid syntax
例外:
即使語法正確,也可能導(dǎo)致錯誤,我們稱之為錯誤異常,Python中有許多不同類型的異常,例如下面示例中的ValueError。
>>> a = "hello"
>>> int(a)
Traceback (most recent call last):
File "
", line 1, in
ValueError: invalid literal for int() with base 10: 'hello'
如果未正確處理異常,則可能導(dǎo)致程序意外停止。
Python中的內(nèi)置異常
Python有許多有用的內(nèi)置異常,您可能在編程時遇到這些異常。您將遇到的一些更常見的是:
AttributeError -在屬性賦值或引用失敗時引發(fā)。
ImportError -Raised未找到導(dǎo)入的模塊。
IndexError - 當(dāng)序列的索引超出范圍時引發(fā)。
KeyError - 在字典中找不到鍵時引發(fā)。
KeyboardInterrupt - 當(dāng)用戶點(diǎn)擊中斷鍵(Ctrl + c或刪除)時增加。
NameError - 在本地或全局范圍內(nèi)找不到變量時引發(fā)。
**SyntaxError **- 遇到語法錯誤時由解析器引發(fā)。
**IndentationError **- 在縮進(jìn)不正確時引發(fā)。
ValueError - 當(dāng)函數(shù)獲取正確類型但值不正確的參數(shù)時引發(fā)。
ZeroDivisionError :當(dāng)數(shù)字除以零時引發(fā)。
沒有處理異常的問題
例外是暫停程序執(zhí)行的條件,如果處理不當(dāng),可能會導(dǎo)致很多問題??紤]以下簡單示例:
>>> def divide_my_number(num1, num2):
... result = num1 / num2
... print(f"num1/num2 gives {result}")
讓我們用不同的值來調(diào)用這個函數(shù)。請注意,我們不會在此處理任何異常:
>>> divide_my_number(10,2)
num1/num2 gives 5.0
讓我們將其除以零并仔細(xì)觀察它會拋出的錯誤:
>>> divide_my_number(10,0)
Traceback (most recent call last):
File "
", line 1, in
File "
", line 2, in divide_my_number
ZeroDivisionError: division by zero
我們可以看到程序沒有成功執(zhí)行并返回了一個異常,可以正常處理以避免這種停頓。
零分割是一種常見的情況,我們可以有很多場景,我們不希望我們的程序意外停止,例如處理文件,API或任何我們不希望我們的用戶使用的真實(shí)應(yīng)用程序時看到這些奇怪的錯誤。
一旦我們將學(xué)習(xí)所有概念,我們將看到如何在函數(shù)(divide_my_number)中處理此異常。
python中的異常處理
異常處理提供了一種機(jī)制來處理代碼的典型控制流中的錯誤或其他異常情況。
許多語言都有“Try-catch”塊的概念。Python使用四個關(guān)鍵字:Try,Except,Else, Finally
可能引發(fā)異常的代碼將進(jìn)入
Try
塊
如果引發(fā)異常,則
Except
塊內(nèi)的代碼將運(yùn)行
Else
是一個可選塊,當(dāng)程序中沒有異常時會引發(fā)該塊
最后
是一個可選塊,它將在最后運(yùn)行,無論是否引發(fā)異常。
讓我們看一下下面的圖片,以便更清晰
>>> try:
... num = int(input("Enter a number: "))
... except ValueError:
... print("Please Enter a Valid number")
...
Enter a number: passing string
Please Enter a Valid number
首先,執(zhí)行try語句。如果沒有異常,那么try語句將完成運(yùn)行try塊內(nèi)的所有內(nèi)容。如果try塊中發(fā)生異常,則跳過行的其余部分,如果異常類型與except中提供的名稱匹配,則將執(zhí)行except子句(如上面代碼中的ValueError)。如果異常與任何特定名稱不匹配,則執(zhí)行將停止。
捕獲Python中的特定異常
一個except子句可能有多個異常,我們可以將它作為元組傳遞。
>>> 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)閉文件。最后是一個可選塊,它將在最后運(yùn)行,無論是否拋出異常。
>>> 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!!
如您所見,即使發(fā)生異常,最終塊也會被打印出來。
提高例外
該加薪語句允許程序員強(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 "
", line 1, in
File "
", line 3, in numbers_less_than_five
ValueError
如果您想了解有關(guān)異常的更多信息,請查看官方文檔8.錯誤和例外
自定義例外
Python有許多內(nèi)置的Exception,但有時我們需要根據(jù)我們的用例定義自己的異常。
在Python中,我們可以通過繼承Exception類來創(chuàng)建一個新類,如下例所示。
>>> class MyException(Exception):
... # Write your logic here
... pass
...
我們可以使用raise關(guān)鍵字提出自己的自定義異常
>>> raise MyException()
Traceback (most recent call last):
File "
", line 1, in
__main__.MyException
>>>
按照承諾,讓我們使用我們學(xué)到的所有概念來處理函數(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來處理異常的各種方法。我們還學(xué)到了各種各樣的概念
- 在該try子句中,將執(zhí)行所有語句,直到遇到異常。
- except 用于處理try塊中引發(fā)的異常。
- else 只有在try子句中沒有遇到異常時,塊才會運(yùn)行
- finally 使您能夠執(zhí)行應(yīng)該始終運(yùn)行的代碼段,而不管是否引發(fā)異常。
- raise 允許您在程序的任何時候拋出異常。
- 我們可以創(chuàng)建自己的異常類,并根據(jù)自己的需要進(jìn)行提升。
- 希望本文能幫助您理解Python中異常處理的概念。
請繼續(xù)關(guān)注這樣的更多教程。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
