1

这是我在 vb.net 上的第一个项目,我现在正在努力将 vba 工作插件迁移到 vb.net COM 插件。我想我有点明白了,但错误处理让我受阻。

这是我一直用来了解 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) 弹出一些意外的东西(对象变量或未设置块变量)我在这里做错了什么?感谢:D

4

1 回答 1

0

这可能是因为你正在做一个

Throw ex

尝试使用

Throw 

反而。这样可以维护错误堆栈,而不是每次都生成一个新堆栈。

根据您的评论,我认为您遇到的具体问题在于您的问题Finally。您正在尝试关闭记录集和连接,但如果您在实例化它们时遇到错误,它们将不存在;因此,您会收到Object variable or with block错误消息。

(无论如何,我都会把连接放在一个 using 语句中)。

于 2013-10-29T16:12:16.173 回答