Python之自定義異常並丟擲該異常

2021-10-13 21:12:41 字數 4245 閱讀 3715

一. 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...