溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python異常處理體系結(jié)構(gòu)

發(fā)布時(shí)間:2021-08-25 14:58:33 來(lái)源:億速云 閱讀:174 作者:chen 欄目:編程語(yǔ)言

這篇文章主要講解了“Python異常處理體系結(jié)構(gòu)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Python異常處理體系結(jié)構(gòu)”吧!

Python內(nèi)建異常體系結(jié)構(gòu)

The class hierarchy for built-in exceptions is:

BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StandardError
|    +-- BufferError
|    +-- ArithmeticError
|    |    +-- FloatingPointError
|    |    +-- OverflowError
|    |    +-- ZeroDivisionError
|    +-- AssertionError
|    +-- AttributeError
|    +-- EnvironmentError
|    |    +-- IOError
|    |    +-- OSError
|    |         +-- WindowsError (Windows)
|    |         +-- VMSError (VMS)
|    +-- EOFError
|    +-- ImportError
|    +-- LookupError
|    |    +-- IndexError
|    |    +-- KeyError
|    +-- MemoryError
|    +-- NameError
|    |    +-- UnboundLocalError
|    +-- ReferenceError
|    +-- RuntimeError
|    |    +-- NotImplementedError
|    +-- SyntaxError
|    |    +-- IndentationError
|    |         +-- TabError
|    +-- SystemError
|    +-- TypeError
|    +-- ValueError
|         +-- UnicodeError
|              +-- UnicodeDecodeError
|              +-- UnicodeEncodeError
|              +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning

捕獲異常的方式

方法一:捕獲所有的異常

  ''' 捕獲異常的***種方式,捕獲所有的異常 '''
    try:
        a = b
        b = c
    except Exception,data:
        print Exception,":",data
    '''輸出:<type 'exceptions.Exception'> : local variable 'b' 
referenced before assignment ''

方法二:采用traceback模塊查看異常,需要導(dǎo)入traceback模塊

   ''' 捕獲異常的第二種方式,使用traceback查看異常 '''
try:
a = b
b = c
except:
print traceback.print_exc()
'''輸出: Traceback (most recent call last):
File "test.py", line 20, in main
a = b
UnboundLocalError: local variable 'b' referenced before assignmen

方法三:采用sys模塊回溯***的異常

''' 捕獲異常的第三種方式,使用sys模塊捕獲異常 '''
try:
a = b
b = c
except:
info = sys.exc_info()
print info
print info[0]
print info[1]
'''輸出:
(<type 'exceptions.UnboundLocalError'>, UnboundLocalError("local 
variable 'b' referenced before assignment",),
<traceback object at 0x00D243F0>)
<type 'exceptions.UnboundLocalError'>
local variable 'b' referenced before assignment
'''

Python異常體系介紹

Python的異常處理可以向用戶(hù)準(zhǔn)確反饋出錯(cuò)信息,所有異常都是基類(lèi)Exception的子類(lèi)。自定義異常都是從基類(lèi)Exception中繼承。Python自動(dòng)將所有內(nèi)建的異常放到內(nèi)建命名空間中,所以程序不必導(dǎo)入exceptions模塊即可使用異常。

可以使用的語(yǔ)句結(jié)構(gòu)形式:

方式一:使用try,except語(yǔ)句來(lái)捕獲異常,可以有無(wú)數(shù)個(gè)except語(yǔ)句來(lái)處理異常,如果所有except語(yǔ)句都沒(méi)捕獲到,則拋出異常到調(diào)用此方法的函數(shù)內(nèi)處理,直到系統(tǒng)的主函數(shù)來(lái)處理。
使用except子句需要注意的事情,就是多個(gè)except子句截獲異常時(shí),如果各個(gè)異常類(lèi)之間具有繼承關(guān)系,則子類(lèi)應(yīng)該寫(xiě)在前面,否則父類(lèi)將會(huì)直接截獲子類(lèi)異常。放在后面的子類(lèi)異常也就不會(huì)執(zhí)行到了。

try:
block
except [excpetion,[data...]]:
block
except [excpetion,[data...]]:
block
except [excpetion,[data...]]:
block

方式二:當(dāng)沒(méi)有異常發(fā)生的時(shí)候執(zhí)行else語(yǔ)句

try:
block
except  [excpetion,[data...]]:
block
else:
block

方式三:finally 語(yǔ)句,不管有沒(méi)有發(fā)生異常都將執(zhí)行finally語(yǔ)句塊

例如我們?cè)趐ython中打開(kāi)一個(gè)文件進(jìn)行讀寫(xiě)操作,我在操作過(guò)程中不管是否出現(xiàn)異常,最終都是要把該文件關(guān)閉的。

try:
block
finally:
block

方式四:try,except,finally

try:
block
except:
block
finally:
block

引發(fā)異常

raise [exception[,data]]

在Python中,要想引發(fā)異常,最簡(jiǎn)單的形式就是輸入關(guān)鍵字raise,后跟要引發(fā)的異常的名稱(chēng)。

異常名稱(chēng)標(biāo)識(shí)出具體的類(lèi):Python異常是那些類(lèi)的對(duì)象。執(zhí)行raise語(yǔ)句時(shí),Python會(huì)創(chuàng)建指定的異常類(lèi)的一個(gè)對(duì)象。

raise語(yǔ)句還可指定對(duì)異常對(duì)象進(jìn)行初始化的參數(shù)。為此,請(qǐng)?jiān)诋惓n?lèi)的名稱(chēng)后添加一個(gè)逗號(hào)以及指定的參數(shù)(或者由參數(shù)構(gòu)成的一個(gè)元組)。

例:

try:
raise MyError #自己拋出一個(gè)異常
except MyError:
print 'a error'
raise ValueError,’invalid argument’

捕捉到的內(nèi)容為:

type  = VauleError
message = invalid argument

異常處理的一些其它用途

除了處理實(shí)際的錯(cuò)誤條件之外,對(duì)于異常還有許多其它的用處。在標(biāo)準(zhǔn) Python 庫(kù)中一個(gè)普通的用法就是試著導(dǎo)入一個(gè)模塊,然后檢查是否它能使用。

導(dǎo)入一個(gè)并不存在的模塊將引發(fā)一個(gè) ImportError 異常。你可以使用這種方法來(lái)定義多級(jí)別的功能――依靠在運(yùn)行時(shí)哪個(gè)模塊是有效的,或支持多種平臺(tái) (即平臺(tái)特定代碼被分離到不同的模塊中)。

你也能通過(guò)創(chuàng)建一個(gè)從內(nèi)置的 Exception 類(lèi)繼承的類(lèi)定義你自己的異常,然后使用 raise 命令引發(fā)你的異常。如果你對(duì)此感興趣,請(qǐng)看進(jìn)一步閱讀的部分。

下面的例子演示了如何使用異常支持特定平臺(tái)功能。代碼來(lái)自 getpass 模塊,一個(gè)從用戶(hù)獲得口令的封裝模塊。獲得口令在 UNIX、Windows 和 Mac OS 平臺(tái)上的實(shí)現(xiàn)是不同的,但是這個(gè)代碼封裝了所有的不同之處。

例支持特定平臺(tái)功能

 # Bind the name getpass to the appropriate function
  try:
import termios, TERMIOS                    
except ImportError:
try:
import msvcrt                          
except ImportError:
try:
from EasyDialogs import AskPassword
except ImportError:
getpass = default_getpass          
else:                                  
getpass = AskPassword
else:
getpass = win_getpass
else:
getpass = unix_getpass

termios 是 UNIX 獨(dú)有的一個(gè)模塊,它提供了對(duì)于輸入終端的底層控制。

如果這個(gè)模塊無(wú)效 (因?yàn)樗辉谀愕南到y(tǒng)上,或你的系統(tǒng)不支持它),則導(dǎo)入失敗,Python 引發(fā)我們捕捉的 ImportError 異常。

OK,我們沒(méi)有 termios,所以讓我們?cè)囋?msvcrt,它是 Windows 獨(dú)有的一個(gè)模塊,可以提供在 Microsoft Visual C++ 運(yùn)行服務(wù)中的許多有用的函數(shù)的一個(gè)API。如果導(dǎo)入失敗,
Python 會(huì)引發(fā)我們捕捉的 ImportError 異常。

如果前兩個(gè)不能工作,我們?cè)囍鴱?EasyDialogs 導(dǎo)入一個(gè)函數(shù),它是 Mac OS 獨(dú)有的一個(gè)模塊,提供了各種各樣類(lèi)型的彈出對(duì)話框。再一次,如果導(dǎo)入失敗,Python 會(huì)引發(fā)一個(gè)我們捕捉的 ImportError 異常。

這些平臺(tái)特定的模塊沒(méi)有一個(gè)有效 (有可能,因?yàn)?Python 已經(jīng)移植到了許多不同的平臺(tái)上了),所以我們需要回頭使用一個(gè)缺省口令輸入函數(shù) (這個(gè)函數(shù)定義在 getpass 模塊中的別的地方)。注意我們?cè)谶@里所做的:我們將函數(shù) default_getpass 賦給變量 getpass。如果你讀了官方 getpass 文檔,它會(huì)告訴你 getpass 模塊定義了一個(gè) getpass 函數(shù)。它是這樣做的:通過(guò)綁定 getpass 到正確的函數(shù)來(lái)適應(yīng)你的平臺(tái)。然后當(dāng)你調(diào)用 getpass 函數(shù)時(shí),你實(shí)際上調(diào)用了平臺(tái)特定的函數(shù),是這段代碼已經(jīng)為你設(shè)置好的。你不需要知道或關(guān)心你的代碼正運(yùn)行在何種平臺(tái)上;只要調(diào)用 getpass,則它總能正確處理。

一個(gè) try...except 塊可以有一條 else 子句,就像 if 語(yǔ)句。如果在 try 塊中沒(méi)有異常引發(fā),然后 else 子句被執(zhí)行。在本例中,那就意味著如果 from EasyDialogs import AskPassword 導(dǎo)入可工作,所以我們應(yīng)該綁定 getpass 到 AskPassword 函數(shù)。其它每個(gè) try...except 塊有著相似的 else 子句,當(dāng)我們發(fā)現(xiàn)一個(gè) import 可用時(shí),就綁定 getpass 到適合的函數(shù)。

自定義異常類(lèi),繼承Exception類(lèi)及其子類(lèi)

 class MyError( ArithmeticError ):
pass
class MyError2 ( Exception ):
pass

感謝各位的閱讀,以上就是“Python異常處理體系結(jié)構(gòu)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Python異常處理體系結(jié)構(gòu)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI