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

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