您好,登錄后才能下訂單哦!
這篇“怎么在Python中處理異常”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么在Python中處理異常”文章吧。
讓我們從了解Python 中try和except語句的語法開始介紹。通用模板如下圖所示:
try:
# There can be errors in this block
except <error type>:
# Do this to handle exception;
# executed if the try block throws an error
else:
# Do this if try block executes successfully without errors
finally:
# This block is always executed
讓我們看看不同塊的用途:
該try代碼塊是你想嘗試執行的語句塊。但是,由于異常可能會出現運行時錯誤,所以此塊可能無法按預期工作。
該except代碼塊是觸發try塊時需要執行的語句。它包含一組語句,這些語句通常會為您提供有關try塊內出錯的一些處理方法。
您應該始終提及您打算在代碼塊內作為異常捕獲的錯誤類型,由上述代碼段中的占位符表示。例如:except<error type>
您也可以不在except指定<error type>. 但是,這不是推薦的做法,因為您沒有考慮可能發生的不同類型的錯誤。
在嘗試執行try塊內的代碼時,也有可能發生多個錯誤。
例如,您可能正在使用超出范圍的索引訪問列表,使用錯誤的字典鍵,并嘗試打開一個不存在的文件 - 所有這些都應該放在try塊內。
在這種情況下,你可能會碰到IndexError
,KeyError
和FileNotFoundError
。并且您必須添加與except您預期的錯誤數量一樣多的每種類型的錯誤一個。
僅當try塊在沒有錯誤的情況下執行時,才會觸發else塊。當您希望在try塊成功后執行后續操作時,這可能非常有用。例如,如果您嘗試成功打開一個文件,則可能需要讀取其內容。
該finally塊總是被執行,而不管其他塊中發生了什么。當您想在執行特定代碼塊后釋放資源時,這很有用。
注意:else和finally塊是可選的。在大多數情況下,您可以只使用try塊來嘗試做某事,并將錯誤捕獲為except塊內的異常。
在接下來的幾分鐘內,您將使用迄今為止學到的知識來處理 Python 中的異常。讓我們開始吧。
如何處理Python中的ZeroDivision(除零異常)錯誤
考慮下面所示的函數divide()。它接受兩個參數 num和div ,并返回除法運算的商num/div。
def divide(num,div):
return num/div
? 使用不同的參數調用函數會按預期返回結果:
res = divide(100,8)
print(res)
# Output
12.5
res = divide(568,64)
print(res)
# Output
8.875
此代碼工作正常,直到您嘗試除以零:
divide(27,0)
您會看到程序崩潰并拋出ZeroDivisionError:
# Output
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-19-932ea024ce43> in <module>()
----> 1 divide(27,0)
<ipython-input-1-c98670fd7a12> in divide(num, div)
1 def divide(num,div):
----> 2 return num/div
ZeroDivisionError: division by zero
您可以通過執行以下操作將此除以零作為異常處理:
在try塊中,調用divide()函數。從本質上講,您正在試圖將num除以div。
當div為0的情況作為except塊內的異常處理。
在此示例中,您可以通過打印一條消息來通知用戶他們嘗試除以零,從而排除ZeroDivisionError
異常。
這顯示在下面的代碼片段中:
try:
res = divide(num,div)
print(res)
except ZeroDivisionError:
print("You tried to divide by zero :( ")
使用有效的輸入,代碼仍然可以正常工作。
divide(10,2)
# Output
5.0
當您嘗試除零時,您會收到發生異常的通知,并且程序會正常結束。
divide(10,0)
# Output
You tried to divide by zero :(
在本節中,您將看到如何在 Python 中使用try和except處理一個 TypeError。
? 考慮以下函數add_10(),它接受一個數字作為參數,將其加 10,然后返回加法的結果。
def add_10(num):
return num + 10
您可以使用任意數字參數調用該函數,它會正常工作,如下所示:
result = add_10(89)
print(result)
#Output
99
現在嘗試add_10()使用"five"而不是調用5。
add_10("five")
您會注意到您的程序崩潰并顯示以下錯誤消息:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-15-9844e949c84e> in <module>()
----> 1 add_10("five")
<ipython-input-13-2e506d74d919> in add_10(num)
1 def add_10(num):
----> 2 return num + 10
TypeError: can only concatenate str (not "int") to str
該錯誤消息TypeError: can only concatenate str (not "int") to str
說明您只能連接兩個字符串,而不能向字符串添加整數。
現在,您有以下內容:
給定一個數字my_num,嘗試使用my_num作為參數調用函數add_10()。如果參數是有效類型,則不存在異常
否則,將觸發與TypeError對應的except塊,通知用戶參數的類型無效。
這一點解釋如下:
my_num = "five"
try:
result = add_10(my_num)
print(result)
except TypeError:
print("The argument `num` should be a number")
由于您現在已將TypeError
作為異常處理,因此您只會被告知參數的類型無效。
The argument `num` should be a number
如果您之前使用過 Python 列表或任何可迭代的 Python數據類型,您可能會遇到IndexError
.
這是因為通常很難跟蹤可迭代對象的所有更改。并且您可能正在嘗試訪問無效索引處的項。
? 在這個例子中,列表my_list有 4 個項。如果使用負索引,則有效索引為 0、1、2 和 3,以及 -1、-2、-3、-4。
由于2是有效的索引,您可以看到索引2中的項被打印出來,即C++:
my_list = ["Python","C","C++","JavaScript"]
print(my_list[2])
#Output
C++
如果您嘗試訪問位于有效索引范圍之外的索引處的項,您將遇到IndexError
:
print(my_list[4])
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-7-437bc6501dea> in <module>()
1 my_list = ["Python","C","C++","JavaScript"]
----> 2 print(my_list[4])
IndexError: list index out of range
如果您熟悉該模式,您現在將使用try和except來處理索引錯誤。
? 在下面的代碼片段中,您嘗試訪問由 指定的索引處的項目search_idx。
search_idx = 3
try:
print(my_list[search_idx])
except IndexError:
print("Sorry, the list index is out of range")
這里,search_idx( 3) 是一個有效的索引,并且打印出特定索引處的項目:
JavaScript
如果search_idx超出索引的有效范圍,則 except 塊將 捕獲IndexError為異常,并且不再有錯誤消息。
search_idx = 4
try:
print(my_list[search_idx])
except IndexError:
print("Sorry, the list index is out of range")
而是顯示search_idx超出有效索引范圍的消息:
Sorry, the list index is out of range
在使用 Python 詞典時可能遇到過KeyError。
? 考慮這個例子,你有一本字典my_dict。
my_dict ={"key1":"value1","key2":"value2","key3":"value3"}
search_key = "non-existent key"
print(my_dict[search_key])
字典my_dict有 3 個鍵值對,"key1:value1", "key2:value2", 和"key3:value3"
現在,您嘗試訪問字典并訪問與 key 對應的值"non-existent key"。
正如預期的那樣,你會得到一個KeyError:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-2-2a61d404be04> in <module>()
1 my_dict ={"key1":"value1","key2":"value2","key3":"value3"}
2 search_key = "non-existent key"
----> 3 my_dict[search_key]
KeyError: 'non-existent key'
幾乎可以像處理IndexError一樣處理KeyError.
您可以嘗試訪問與指定的鍵對應的值search_key。
如果search_key確實是一個有效的鍵,則打印出相應的值。
如果由于密鑰不存在而遇到異常,您可以使用該except塊讓用戶知道。
這在下面的代碼片段中進行了解釋:
try:
print(my_dict[search_key])
except KeyError:
print("Sorry, that's not a valid key!")
Sorry, that's not a valid key!
? 如果您想提供其他操作,例如無效密鑰的名稱,您也可以這樣做:密鑰可能拼寫錯誤,使其無效。在這種情況下,讓用戶知道使用的密鑰可能會幫助他們修復拼寫錯誤。
您可以通過捕獲無效密鑰<error_msg>并在發生異常時打印的消息中使用它來實現此目的:
try:
print(my_dict[search_key])
except KeyError as error_msg:
print(f"Sorry,{error_msg} is not a valid key!")
? 注意鍵名也是如何打印出來的:
Sorry,'non-existent key' is not a valid key!
在 Python 中處理文件時發生的另一個常見錯誤是FileNotFoundError.
? 在以下示例中,您嘗試通過指定open()函數的路徑來打開文件my_file.txt。并且您想讀取該文件并打印出該文件的內容。
但是,您尚未在指定位置創建文件。
如果您嘗試運行下面的代碼片段,您將得到FileNotFoundError:
my_file = open("/content/sample_data/my_file.txt")
contents = my_file.read()
print(contents)
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-4-4873cac1b11a> in <module>()
----> 1 my_file = open("my_file.txt")
FileNotFoundError: [Errno 2] No such file or directory: 'my_file.txt'
并使用try和 except,您可以執行以下操作:
嘗試在try塊中打開文件。
處理FileNotFoundError:通過except讓用戶知道他們試圖打開一個不存在的文件塊。
如果try塊成功,并且文件確實存在,則讀取并打印出文件的內容。
在finally塊中,關閉文件,以免浪費資源。回想一下文件將如何關閉,而不管文件打開和讀取步驟中發生了什么。
try:
my_file = open("/content/sample_data/my_file.txt")
except FileNotFoundError:
print(f"Sorry, the file does not exist")
else:
contents = my_file.read()
print(contents)
finally:
my_file.close()
請注意您是如何將錯誤作為異常處理的,程序結束時會優雅地顯示以下消息:
Sorry, the file does not exist
? 讓我們考慮else觸發塊的情況。該文件my_file.txt現在位于前面提到的路徑中。
現在,重新運行之前的代碼片段按預期工作。
以上就是關于“怎么在Python中處理異常”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。