VB6能否做結構化的異常處理

來源:互聯網
上載者:User

VB6能否做結構化的異常處理。

C++ Builder 對結構化異常處理做了擴充,支援 __Finally 關鍵字,保證了常式只有一個出口,是很科學的一種錯誤處理方法,體現了 C++ Builder 開發人員深厚的編程經驗與智慧。VB.NET 對它的模仿就是對結構化異常處理最大的讚許。
 
請看一個VB.NET結構化異常處理的例子。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Long, j As Long
        j = 0
        Try
            i = 1 / j
        Catch
            MsgBox("ERROR")
        Finally
            MsgBox("Finally")
        End Try
    End Sub

當然,在實際編程中我們不會做僅僅彈出一個msgbox這麼無聊的動作。Try 結構中
我們通常放一些可能引發異常的代碼,這類的代碼大多是訪問檔案(因為讀寫檔案可能遇到被拒、磁碟滿等情況)、訪問註冊表 等不可靠操作。當try結構中的代碼執行出現異常時,程式直接跳轉,執行catch結構中的代碼,catch結構中,我們通常是放一些報告錯誤、處理錯誤的代碼,比如用 Msgbox 報告給使用者出了什麼錯,下一步使用者該如何做等等資訊。不論 是否發生異常,Finally結構中的代碼是總是要執行的,因此我們可以在finally結構中放進去一些被稱作“清理性代碼”的語句,比如,關閉開啟的檔案、關閉開啟的句炳、釋放對象的執行個體等操作。

VB6是基於COM的開發語言,和c++中的棧上建立對象有很大的不同。VB6中的COM對象具有引用計數機制,這就意味著,在一個常式結束後,物件變數(指向對象執行個體的指標)會被自動銷毀,那麼對象執行個體的引用計數器的數值就會減一,如果計數器減到0,這個執行個體就會被系統自動銷毀。而C++的棧上建立的對象則沒有這種自我管理機制,它需要程式員顯式的釋放對象執行個體。(關於COM的原理,先說到這,以後專門詳談)。總之,對VB6來說,用結構化異常來保證對象執行個體的銷毀並不是顯得那麼有用,但我們有足夠的理由在VB6中使用結構化異常處理,顯而易見,前面提到的那些情況:關閉開啟的檔案、關閉開啟的各種句炳,這些都是使用結構化異常處理的理由。

VB6雖然沒有直接提供結構化異常處理機制,但其實只要把 On Error 語句稍做變通就可以了。

請看VB6類比出的結構化異常處理:
try: On Error GoTo catch
'{
    
     在這裡添加“不可靠代碼”

'}
GoTo finally
catch:
'{
     
     在這裡添加“錯誤報表、錯誤處理代碼”     

'}
finally:
'{

     在這裡添加“清理性代碼,比如:關閉檔案、關閉句炳等”

'}

也許您可能持反對意見,告訴我這段代碼用了 goto 語句,這是不好的編程風格。
不提倡用goto 是因為 濫用goto 會把代碼變成“亂麵條”,但很明顯這段代碼並沒有
濫用goto ,而是非常謹慎了的用了一下 goto ,代碼中的goto 全部整齊劃一的指向
finally 語句。

如果您有“goto 潔癖”,那麼只好試試這個了:
try: On Error GoTo catch
'{
    
     在這裡添加“不可靠代碼”

'}
finally:
'{

     在這裡添加“清理性代碼,比如:關閉檔案、關閉句炳等”

Exit Sub
'}

catch:
'{

     在這裡添加“錯誤報表、錯誤處理代碼”    

Resume finally
'}
這種格式和前者是等效的,它沒用goto,但我覺得它比前者更“麵條”一些。^_^個人喜歡第一種。

後記:
1.注意:finally 中一定要放穩固的代碼,如果finally中出了錯,就會導致異常無法處理。
2.這種對結構化異常處理的類比只是基本的類比,與真正的結構化異常處理比起來,還是有差別的,比如真正的結構化異常處理是可以嵌套的,也就是說一個try..catch...finally結構中可以嵌入另一個try...catch...finally結構。
3.我並不排斥與否定vb6傳統的錯誤處理方法,vb6的錯誤處理語句很強大,靈活的運用才能更好的解決問題,不要局限於本文中的一個模式。傳統的錯誤處理方法在MSDN中已有詳細的介紹和樣本,本文不再贅述。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.