2013-10-29 28 views
1

這是我在vb.net上的第一個項目,我現在正努力將vba工作添加到vb.net COM加載項。我認爲我有點不舒服,但是錯誤處理讓我感到困惑。VB .NET錯誤處理,給調用者傳遞錯誤

這是一個測試,我一直在使用,以瞭解在try-catch以及如何通過例外呼叫者

Public Sub test() 
    Dim ActWkSh As Excel.Worksheet 
    Dim ActRng As Excel.Range 
    Dim ActCll As Excel.Range 
    Dim sVar01 As String 
    Dim iVar01 As Integer 
    Dim sVar02 As String 
    Dim iVar02 As Integer 
    Dim objVar01 As Object 

    ActWkSh = Me.Application.ActiveSheet 
    ActRng = Me.Application.Selection 
    ActCll = Me.Application.ActiveCell 
    iVar01 = iVar02 = 1 
    sVar01 = CStr(ActCll.Value) 
    sVar02 = CStr(ActCll.Offset(1, 0).Value) 
    Try 
     objVar01 = GetValuesV(sVar01, sVar02) 
     'DO SOMETHING HERE 
    Catch ex As Exception 
     MsgBox("ERROR: " + ex.Message) 
     'LOG ERROR SOMEWHERE 
    Finally 
     MsgBox("DONE!") 
    End Try 

End Sub 

Private Function GetValuesV(ByVal QryStr As Object, ByVal qryConn As String) As Object 

    Dim cnn As Object 
    Dim rs As Object 

    Try 
     cnn = CreateObject("ADODB.Connection") 
     cnn.Open(qryConn) 
     rs = CreateObject("ADODB.recordset") 

     rs = cnn.Execute(QryStr) 

     If rs.EOF = False Then 
      GetValuesV = rs.GetRows 
     Else 
      Throw New System.Exception("Query Return Empty Set") 
     End If 

    Catch ex As Exception 
     Throw ex 
    Finally 
     rs.Close() 
     cnn.Close() 
    End Try 

End Function 

我想有錯誤消息來測試,但 MSGBOX( 「ERRORE:」+ ex.Message) 彈出一些意想不到的事情(Object variable或With block variable not set) 我在這裏做錯了什麼? 感謝 d

+0

您期待什麼錯誤?你試圖抓住什麼(錯誤的)行爲? – varocarbas

+0

打開CLR異常 - 調試 - >異常並檢查公共語言運行時異常(引發)。這應該在錯誤時打破。 –

+0

我的想法是在消息箱中獲取完整的錯誤消息,以便它可以記錄在文件(或工作表)中。錯誤是我沒有得到定製的錯誤或任何其他錯誤,我通過語法錯誤的查詢或連接字符串中的拼寫錯誤觸發。我得到了「對象變量..」的東西。 – user1375452

回答

0

這可能是因爲你正在做一個

Throw ex 

嘗試使用

Throw 

代替。這將維護錯誤堆棧,而不是每次都生成一個新堆棧。

根據你的意見,我認爲你得到的具體問題是在你的Finally區塊。您試圖關閉記錄集和連接,但是如果您在實例化它們時遇到錯誤,它們將不存在;因此,您會收到Object variable or with block錯誤。

(我會把連接是一個使用聲明無論如何)。

+0

好的......對我來說很合理:)但是你有什麼建議?將記錄集和/或連接掛在那裏?我的想法是有一個乾淨的代碼,負責每一個對象...我再說一遍,我第一次玩弄try-catch :)幫我寫了一段代碼:) – user1375452

+0

剛剛測試過。它的工作原理;) – user1375452

+0

如果你的錯誤是與生成連接,那麼你沒有一個。如果你把代碼放在using語句中,那麼我相信,如果它出錯,它會爲你處理對象。 –