Python上手 錯誤型別與異常捕獲

2021-09-09 08:05:26 字數 3663 閱讀 1360

# 異常層級關係

下面的圖展示了python中各種異常類的層級關係,可以發現,他們都是繼承自baseexception類。

# 6種常見異常

除0錯誤(zerodivisionerror):除數為0

名稱錯誤(nameerror):變數使用之前未進行宣告或者初始化

型別錯誤(typeerror):某些函式或者方法只適用於特定資料型別,若資料型別操作不當會報此錯

數值錯誤(valueerror):輸入型別正確的情況下,具體輸入數值錯誤

索引錯誤(indexerror):超出序列長度的索引操作

屬性錯誤(attributeerror):方法或者屬性不適用於該物件

# 除0錯誤(zerodivisionerror)

num =

3num /

0# 名稱錯誤(nameerror)

variable_a

# 型別錯誤(typeerror)

num =

3num +

'3'# 數值錯誤(typeerror)

float

('3'

)float

('hackdata'

)# 索引錯誤(typeerror)

hack_list =

['h'

,'a'

,'c'

,'k'

]hack_list[10]

# 屬性錯誤

tuple_hack =

('h'

,'a'

,'c'

)tuple_hack(

'k')

為了防止程式因出現異常而停止執行,我們要對可能出現的異常提前預警並設定相應的處理方案,這就是異常的捕獲。

# 異常的捕獲

主要通過try...except...語句來實現異常捕獲。將可能出現錯誤的**塊放在try中,except則根據多種錯誤型別設定異常處理方案。以下是例子:

try

:# 正常執行

except exception1 as e:

# 發生exception1時的處理方式

except exception2 as e:

# 發生exception1時的處理方式

else

:# 正確時候執行

finally

:# 無論對錯都執行

# 異常的丟擲

raise valueerror(

'this is a value error'

)

# 自定義異常

當然,python中內建異常類無法覆蓋所有異常情況,我們需要根據可能產生的特定錯誤自定義異常。自定義異常繼承於exception類,由它開始擴充套件。下面是乙個簡單示例:

class

myerror

(exception)

:pass

raise myerror(u'something error'

)"""

示例:自定義notinterror,捕獲非整型錯誤

"""class

notinterror

(exception)

:def

__init__

(self, error)

: self.error = error

a =[1,

2,"",

4,5,

"a",

['1'

,'2'

,'3']]

for i in

range

(len

(a))

:try:if

type

(a[i])!=

int:

raise notinterror(

"錯誤"

)except notinterror, e:

print e.error

finally

:print a[i]

乙個完整的使用自定義異常捕獲的例子

# 第一步:定義異常

class

error

(exception)

:pass

class

openfileerror

(error)

:pass

class

writecontenterror

(error)

:pass

defwrite

(content):if

isinstance

(content,

str)

: f =

open

('file.txt'

,'w'

)try

: f.write(content)

except exception:

raise writecontenterror # 丟擲寫入異常

finally

: f.close(

)else

:raise openfileerror # 丟擲開啟異常

# 第二步,呼叫**

import logging

try:

write(2)

except openfileerror as e:

# 對丟擲異常的處理

logging.error(e)

except writecontenterror as e:

# 對丟擲異常的處理

logging.error(e)

except error:

logging.error(

"api error"

)except excetpion:

logging.error(

"api bug"

)else

: logging.info(

"ok"

)

# 一些經驗

關於第3點,我們可以來看乙個例子:

# 異常處理破壞了**邏輯

try:

action_a(

) action_b(

) action_c(

)except actionexceptin as e:

logging.error(e)

else

: action_d(

)# 更優雅的處理方式,將異常**塊抽離到另外乙個函式中

defaction_executor()

: action_a(

) action_b(

) action_c(

)def

action()

:try

: action_executor(

)except actionexceptin as e:

logging.error(e)

action(

)action_d(

)

python 錯誤與異常

錯誤在執行前修改,邏輯錯誤無法修改 執行時,異常產生,檢查到錯誤且直譯器認為是異常,丟擲異常 異常處理,截獲異常,忽略或者終止程式處理異常 try try suite except exception e exception blocktry aexcept nameerror,e print ca...

python 錯誤與異常

開發人員在編寫程式的時候難免會遇到錯誤,那遇到錯誤要如何找到錯誤並處理異常呢?本篇主要實現異常的處理方法。一 錯誤分類 1.語法錯誤 syntaxerror 2.執行時錯誤 這種包括很多異常的型別,eg nameerror zerodivisionerror等 二 異常處理的基本語法 try 執行 ...

Python 錯誤與異常處理

python 有兩種錯誤型別 1 語法錯誤 syntax errors 2 異常 exceptions 語法錯誤就不說了 關於異常處理 用try except 首先try 和 except 之間的 首先被執行,如果沒有異常,則except語句將會被忽略,如果出現異常,則try下的語句將會被忽略,直接...