中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Python中處理異常

發布時間:2022-01-26 09:12:38 來源:億速云 閱讀:138 作者:iii 欄目:開發技術

這篇“怎么在Python中處理異常”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么在Python中處理異常”文章吧。

Python try 和 except 塊的語法

讓我們從了解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塊內。

在這種情況下,你可能會碰到IndexErrorKeyErrorFileNotFoundError。并且您必須添加與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 中處理 TypeError(類型異常)

在本節中,您將看到如何在 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 中處理 IndexError(無效索引)

如果您之前使用過 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(鍵值對異常)

在使用 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(文件找不到異常)

在 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中處理異常”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蕲春县| 澄江县| 深水埗区| 永春县| 虞城县| 盐池县| 乌兰察布市| 静乐县| 庆城县| 古蔺县| 神农架林区| 上犹县| 襄樊市| 阿图什市| 临高县| 肇东市| 太白县| 宜良县| 灵丘县| 微山县| 天门市| 建德市| 凤台县| 台东市| 玉环县| 枣阳市| 长宁县| 贵德县| 乃东县| 绥化市| 竹溪县| 阆中市| 汤阴县| 碌曲县| 海林市| 北流市| 西乡县| 乐清市| 崇文区| 和林格尔县| 泸西县|