# 異常層級關係
下面的圖展示了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下的語句將會被忽略,直接...