Python 基礎(chǔ)教程

Python 流程控制

Python 函數(shù)

Python 數(shù)據(jù)類型

Python 文件操作

Python 對(duì)象和類

Python 日期和時(shí)間

Python 高級(jí)知識(shí)

Python 參考手冊(cè)

Python異常處理 - Try, Except和finally

在本文中,您將了解如何使用try、except和finally語(yǔ)句在Python程序中處理異常。這將激勵(lì)您用Python編寫(xiě)干凈、可讀和高效的代碼。

Python中的異常是什么?

Python有許多內(nèi)置的異常  ,當(dāng)其中的某些錯(cuò)誤出現(xiàn)時(shí),它們會(huì)強(qiáng)制您的程序輸出錯(cuò)誤。

當(dāng)發(fā)生這些異常時(shí),它將導(dǎo)致當(dāng)前進(jìn)程停止并將其傳遞給調(diào)用進(jìn)程,直到被處理為止。如果不處理,我們的程序?qū)⒈罎ⅰ?/p>

例如,如果函數(shù)A調(diào)用函數(shù)B,后者又調(diào)用函數(shù)C,并且在函數(shù)C中發(fā)生異常。如果不在C中處理該異常,則該異常將傳遞給B,然后傳遞給A。

如果不進(jìn)行處理,就會(huì)拋出一條錯(cuò)誤消息,我們的程序就會(huì)意外地突然停止。

在Python中捕捉異常

在Python中,可以使用try語(yǔ)句處理異常。

可能引發(fā)異常的關(guān)鍵操作放在try子句中,并且將處理異常的代碼編寫(xiě)在except子句中。

捕獲異常后,我們將執(zhí)行什么操作取決于我們自己。這是一個(gè)簡(jiǎn)單的示例。

# 導(dǎo)入模塊sys以獲取異常的類型
import sys

randomList = ['a', 0, 2]

for entry in randomList:
    try:
        print("The entry is", entry)
        r = 1/int(entry)
        break
    except:
        print("Oops!",sys.exc_info()[0],"occured.")
        print("Next entry.")
        print()
print("The reciprocal of",entry,"is",r)

輸出結(jié)果

The entry is a
Oops! <class 'ValueError'> occured.
Next entry.

The entry is 0
Oops! <class 'ZeroDivisionError' > occured.
Next entry.

The entry is 2
The reciprocal of 2 is 0.5

在此程序中,我們循環(huán)執(zhí)行,直到用戶輸入具有有效倒數(shù)的整數(shù)??赡軐?dǎo)致異常的部分放在try塊中。

如果沒(méi)有異常發(fā)生,則跳過(guò)除塊以外的內(nèi)容,并繼續(xù)正常流程。但是,如果發(fā)生任何異常,它將被except塊捕獲。

在這里,我們使用sys模塊中的exinfo()函數(shù)打印異常的名稱,并要求用戶再試一次。我們可以看到值‘a(chǎn)’和‘1.3’會(huì)導(dǎo)致ValueError,‘0’會(huì)導(dǎo)致ZeroDivisionError。

捕獲Python中的特定異常

在上面的示例中,我們沒(méi)有在except子句中提到任何異常。

這不是一個(gè)好的編程習(xí)慣,因?yàn)樗鼘⒉东@所有異常并以相同的方式處理每種情況。 我們可以指定except子句會(huì)捕獲哪些異常。

一個(gè)try子句可以有任意數(shù)量的except子句來(lái)以不同的方式處理它們,但是在發(fā)生異常時(shí)只會(huì)執(zhí)行一個(gè)except子句。

我們可以使用值的元組在except子句中指定多個(gè)異常。下面是一個(gè)偽代碼示例。

try:
   #執(zhí)行某些代碼
   pass

except ValueError:
   # 處理ValueError異常
   pass

except (TypeError, ZeroDivisionError):
   # 處理多個(gè)異常
   # TypeError 和 ZeroDivisionError 異常
   pass

except:
   # 處理所有其他異常
   pass

引發(fā)異常

在Python編程中,異常是在運(yùn)行時(shí)出現(xiàn)相應(yīng)錯(cuò)誤時(shí)拋出的,但是我們可以使用關(guān)鍵字raise強(qiáng)制拋出異常。

我們還可以選擇將值傳遞給異常,以闡明為什么會(huì)引發(fā)異常。

>>> raise KeyboardInterrupt
Traceback (most recent call last):
...
KeyboardInterrupt

>>> raise MemoryError("This is an argument")
Traceback (most recent call last):
...
MemoryError: This is an argument

>>> try:
...     a = int(input("輸入一個(gè)正整數(shù): "))
...     if a <= 0:
...         raise ValueError("這不是一個(gè)正數(shù)!")
... except ValueError as ve:
...     print(ve)
...    
輸入一個(gè)正整數(shù): -2
這不是一個(gè)正數(shù)!

try...finally

Python中的try語(yǔ)句可以有一個(gè)可選的finally子句。不管在什么情況下都會(huì)執(zhí)行這個(gè)子句,它通常用于釋放外部資源。

例如,我們可以通過(guò)網(wǎng)絡(luò)連接到遠(yuǎn)程數(shù)據(jù)中心,或者使用文件或使用圖形用戶界面(GUI)。

在所有這些情況下,無(wú)論資源是否成功,我們都必須清除該資源。這些操作(關(guān)閉文件,GUI或與網(wǎng)絡(luò)斷開(kāi)連接)在finally子句中執(zhí)行,以確保執(zhí)行。

這是一個(gè)文件操作的示例來(lái)說(shuō)明這一點(diǎn)。

try:
   f = open("test.txt",encoding = 'utf-8')
   # 執(zhí)行文件操作
finally:
   f.close()

這種類型的構(gòu)造確保即使發(fā)生異常也關(guān)閉文件。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清