在類模塊代碼中啟用錯誤處理

vba語言專業教育 發佈 2022-05-23T22:14:21.764521+00:00

怨話,是一種慢性毒藥,它能消磨人的熱情,能摧毀人的意志,更能影響身邊人的心情,與其花時間去抱怨,不如想辦法去改變。

【分享成果,隨喜正能量】怨話,是一種慢性毒藥,它能消磨人的熱情,能摧毀人的意志,更能影響身邊人的心情,與其花時間去抱怨,不如想辦法去改變。閒話,猶如利器,直戳人的心臟,指點議論就像瘟疫,傷害人的身心,小人,喜歡挑撥離間,閒人,喜歡背後議論,這樣的人,永遠成不了大器。。

《VBA中類的解讀及應用》教程是我推出的第五套教程,目前已經是第一版修訂了。這套教程定位於最高級,是學完初級,中級後的教程。

類,是非常抽象的,更具研究的價值。隨著我們學習、應用VBA的深入,有必要理解這些抽象的理論知識。對象,類,過程,方法,屬性,事件,接口,接口如何實現等等。掌握了這些理論,不僅對於VBA這種寄生語言的實質有所深入的理解,也對自然界的很多事物將同樣有所感悟。目前,這套教程程序文件已經通過32位,64位兩種office系統測試。

這套教程共兩冊,八十四講,今後一段時間會給大家陸續推出修訂後的教程內容。今日的內容是:在類模塊代碼中啟用錯誤處理

第三十八講 類代碼中的錯誤處理----「二師兄」的成長曆程之九

大家好,我們繼續講解類模塊的相關知識這講的內容是:類代碼中的錯誤處理----「二師兄」的成長曆程之九。

1 枚舉處理的失誤點及分析

在二師兄的成長之六----枚舉的利用中,我們談到了用枚舉常量的方案來解決性別屬性的賦值問題。那麼通過這種方案給性別屬性賦值的時候,是不是就一勞永逸了呢?我們回頭找到第34講的測試程序,在代碼中做下面的修改,再仔細的測試一下:

在類代碼性別枚舉中,我們的代碼如下:

這裡我們把性別默認了兩種值,這也是一般的常理,那麼在標準模塊中,我們把性別的屬性賦值為3,是否可以通過呢?通過測試我們得到的答案和我們的初衷是不一致的,居然得到了通過!

為什麼能編譯通過?其實,枚舉常量用起來是非常簡單的,簡單到什麼程度?不負責任的程度。枚舉類型,從本質上講,是長整形(Long),你拿任何一個長整形的值賦給它,它都無條件接受。至於你在這個枚舉類型下面,定義了多少個常量,它一概不管。

從上述的講解及一系列的分析中,我們知道了類中枚舉常量的底線輕易地就可以被人突破,導致類的屬性被設置了不是我們期望的值,你說怎麼辦?既然是我們期望,那麼我們就著手進行解決。

2 在類模塊代碼中啟用錯誤處理

我們將原來性別賦值屬性子程序(Public Property Let Gender)中的代碼全部刪掉,在其中按照上一篇的樣式設置錯誤處理語句,如下面代碼所示:

Public Property Let Gender(lenumGender As pGender)

On Error GoTo ErrHandler

If inGender <> Female And inGender <> Male Then

Err.Raise Number:=vbObjectError + 513, Source:="Person:Gender", Description:="性別必須為男或女"

Else

myGender = inGender

End If

ExitProcedure:

On Error Resume Next

'退出前的必要工作(略)

Exit Property

ErrHandler:

Err.Raise Err.Number, Err.Source, Err.Description

Resume ExitProcedure

End Property

代碼截圖:

代碼解析:

性別屬性被賦的值,是男或者女將作為一個合法的值來處理,如果既不是男,又不是女,那將是一個非法的值。

屬性被賦了非法的值以後,怎麼處理呢?這裡我們用Err對象的Raise方法。

  • Err.Raise的第一個參數是錯誤代碼(Number),可以理解為錯誤的類型。性別必須是男或者女,在VBA中沒有這樣的規定,所以這個錯誤的編號我們可以自己設定;這裡我們把錯誤編號設置為vbObjectError+513,為什麼弄這麼一個奇怪的編號?因為vbObjectError+512之前的號碼都被占用了。vbObjectError是一個系統常量。
  • 另外,我們還在代碼中設置了錯誤的來源(Source)和錯誤的描述(Description)。Source:="Pigsy:Gender", Description:="性別必須為男或女"。

在上述代碼中對於錯誤的處理,語句是:

ErrHandler:

Err.Raise Err.Number, Err.Source, Err.Description

Resume ExitProcedure

  • 大家注意,這裡錯誤的執行語句沒有做任何的處理,所以,上述代碼我們可以簡單些,也是一樣的,代碼如下:

Public Property Let Gender(inGender As pGender)

If inGender <> Female And inGender <> Male Then

Err.Raise Number:=vbObjectError + 513, Source:="Pigsy:Gender", Description:="性別必須為男或女"

Else

myGender = inGender

End If

End Property

標準模塊代碼,如下:

Sub mynz_38()

On Error GoTo ErrHandler

Dim objpigsy As pigsy

Set objpigsy = New pigsy

objpigsy.Name = "豬悟能"

objpigsy.Gender = 3

objpigsy.Speak

MsgBox "修改前性別:" & objpigsy.Gender

objperson.Gender = Male

MsgBox "修改後性別:" & objpigsy.Gender

ExitProcedure:

On Error Resume Next

Set objpigsy = Nothing

Exit Sub

ErrHandler:

MsgBox "錯誤代碼:" & Err.Number & VBA.vbCrLf & _

"錯誤描述:" & Err.Description & VBA.vbCrLf & _

"錯誤來源: " & Err.Source, _

vbCritical, _

"MyNZ 報錯"

Resume ExitProcedure

End Sub

代碼截圖:

代碼解析:上述MYNZ過程,給二師兄性別屬性賦給一個第三類屬性,誰讓他是神仙呢?但是二師兄在骨子裡還是希望自己是男子漢的,以便將來可以再去高老莊,所以類模塊魂的設置中會把這類不合常理的屬性做錯誤處理。

F8逐步執行一下就會知道,雖然你將性別賦值為3,編譯器沒有檢測出非法代碼,運行的時候還是提示錯誤。

今日內容回向:

1 在類模塊中如何自定義設置錯誤處理?

2 枚舉常量的寫法有何優缺點?

本講內容參考程序文件:VBA-CLASS(38).xlsm

我20多年的VBA實踐經驗,全部濃縮在下面的各個教程中:

【分享成果,隨喜正能量】氣話,最傷人,也許你是有口無心,但是聽者有意,也許你是圖個痛快,但是對方寒心,所以,多大的矛盾,都不要說狠話,不要說氣話。。

關鍵字: