一. python中異常捕捉
python中捕捉異常模組try/except,其中python中有一些自定義的異常,具體如下
attributeerror 呼叫不存在的方法引發的異常
eoferror 遇到檔案末尾引發的異常
importerror 匯入模組出錯引發的異常
indexerror 列表月越界引發的異常
ioerror i/o操作引發的異常,如開啟檔案出錯等
keyerror 使用字典中不存在的關鍵字引發的異常
nameerror 使用不存在的變數名引發的異常
taberror 語句塊縮排不正確引發的異常
valueerror 搜尋列表中不存在值引發的異常
zerodivisionerror 除數為零引發的異常
1.1 捕捉異常並丟擲
先通過一段**看下python中異常的捕獲,這裡為了能清楚看到異常,使用traceback模組對異常進行了追蹤
import sys
import traceback
class
defineerror
:def
__init__
(self)
:pass
@staticmethod
deffun_error()
:try
: c =1/
0except exception as e:
info = sys.exc_info(
)# traceback.print_tb(info[2])
traceback.print_exc(
)print
(e,"here is error"
)if __name__ ==
'__main__'
: obj = defineerror(
) obj.fun_error(
)輸出結果
traceback (most recent call last)
: file "d:/work/code/auto_test/define_error.py"
, line 50
,in fun_error
c =1/
0zerodivisionerror: division by zero
division by zero here is error
我們可以看到出現了division by zero的錯誤
1.2 異常追蹤和異常輸出
上面我們可以看到traceback追蹤到異常,接下來介紹異常的處理
class
defineerror
:def
__init__
(self)
:pass
@staticmethod
deffun_error()
:try
: c =1/
0except exception as e:
info = sys.exc_info(
) traceback.print_tb(info[2]
)# traceback.print_exc()
print
(info,
"****************"
)if __name__ ==
'__main__'
: obj = defineerror(
) obj.fun_error(
)輸出結果:
(<
class
'zerodivisionerror'
>
, zerodivisionerror(
'division by zero',)
,>)**
****
****
****
** file "d:/work/code/auto_test/define_error.py"
, line 50
,in fun_error
c =1/
0
使用sys.exc_info()對異常進行追蹤後可以看到輸出乙個包含3個元素的元組,第乙個元素是乙個 zerodivisionerror 類;第 2 個元素是異常型別 zerodivisionerror 類的乙個例項;第 3 個元素為乙個 traceback 物件。其中,通過前 2 個元素可以看出丟擲的異常型別以及描述資訊,對於第 3 個元素,是乙個 traceback 物件,無法直接看出有關異常的資訊,還需要對其做進一步處理
try
: func(
)except
:# 捕捉異常,並將異常傳播資訊輸出控制台
traceback.print_exc(
)# 捕捉異常,並將異常傳播資訊輸出指定檔案中
traceback.print_exc(
file
=open
('log.txt'
,'a'
))
其中使用traceback.print_exc追蹤到的異常可以寫入檔案中
1.3 多異常捕獲
try
:print(1
/0)except
(zerodivisionerror, typeerror, nameerror)
:# nameerror找不到名字(變數)時引發
print
('your numbers were bogus....'
)
我們可以再乙個異常捕獲裡面同時放多個異常捕獲條件,實現多異常捕獲
1.4 異常略過
class
defineerror
:def
__init__
(self)
:pass
@staticmethod
deffun_error()
:try
: c =1/
0except
:# traceback.print_exc()
print
("****************"
)if __name__ ==
'__main__'
: obj = defineerror(
) obj.fun_error(
)
捕捉所有的異常,except後不指定任何異常類即可。但是這樣使用會隱藏沒考慮過的錯誤不推薦。更好的選擇是使用except except as e並對異常物件進行檢查。這樣也會使得不是從except類派生而來的異常漏掉。像systemexit和keyboradinterrupt都是從baseexcept(except的超類)派生而來的
1.5 try結合raise自定義異常
# 先自定義乙個異常丟擲模組
class
mydefineerror
(exception)
:def
__init__
(self, name, reason)
: self.name = name
self.reason = reason
class
test
:def
__init__
(self)
:pass
@staticmethod
defwork
(p):
print
("執行work函式"
)try
:if p <5:
raise mydefineerror(
'自定義錯誤'
,"引數小於既定值"
)except mydefineerror as e:
print
("here is error info, name is %s: reason is %s"
%(e.name, e.reason)
)if __name__ ==
'__main__'
: t = test(
) t.work(4)
輸出結果:
執行work函式
here is error info, name is 自定義錯誤: reason is 引數小於既定值
注意點:
自定義異常模組可以捕捉到自己模組定義的一些異常資訊,但是系統內建的異常資訊無法捕獲到
丟擲異常 自定義異常
1 try catch try catch是這之間所包含的 如果出現異常時捕獲他,並進行處理的,如果 之間有錯誤,不會影響程式繼續執行下去,程式會繼續往後執行。2 throw 是在程式中明確丟擲引發的異常,比如throw new exception 3 finally 不管有沒有異常程式段中都會被執...
python自定義異常 主動丟擲異常
def password verify pwd 密碼大於8位返回值,小於八位主動丟擲異常 if len pwd 8 return pwd elif len pwd 8 自定義異常,並丟擲 pwd error exception 密碼長度小於8位 raise pwd error 呼叫 pwd a in...
如何丟擲異常,自定義異常
定義乙個方法,丟擲 陣列越界和算術異常 多個異常 用 隔開 public void test1 int x throws arrayindexoutofbound ception,arithmeticexception 資料越界異常 else if x 1 算術異常 else if x 2 publ...