【问题标题】:VB .NET error handling, pass error to callerVB .NET 错误处理,将错误传递给调用者
【发布时间】:2013-10-30 00:41:43
【问题描述】:

这是我在 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("错误:" + ex.Message) 弹出一些意想不到的东西(对象变量或未设置块变量) 我在这里做错了什么? 谢谢 D

【问题讨论】:

  • 您期待什么错误?你想捕捉什么(错误的)行为?
  • 打开 CLR 异常 - 调试 -> 异常并检查公共语言运行时异常(抛出)。这应该会在错误处中断。
  • 我的想法是在消息框中获取完整的错误消息,以便可以将其记录在文件(或工作表)中。错误是我没有收到自定义错误或由连接字符串中的语法错误查询或拼写错误触发的任何其他错误。我得到了“对象变量..”的东西。
  • @pm_2:不需要。我确定错误已被正确捕获。但是错误消息没有返回我期望的错误,而是这个“对象变量..”的东西。
  • 即每当我故意使用错误的查询语句时,我希望错误消息是“错误:您的 SQL 语法有错误...”行中的内容,但我得到“错误:对象变量...”

标签: vb.net error-handling


【解决方案1】:

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

Throw ex

尝试使用

Throw 

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

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

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

【讨论】:

  • 好的...对我来说很有意义:) 但你有什么建议?让记录集和/或连接挂在那里?我的想法是拥有一个负责每个对象的干净代码......我再说一遍,我第一次玩 try-catch :) 帮助我编写一段漂亮的代码 :)
  • 如果您的错误在于生成连接,那么您没有连接。如果您将代码放在 using 语句中,那么我相信,如果出错,它将为您处理该对象。
  • 好的,在我的下一个测试中,我将检查我是否可以区分一个错误。如果是这种情况,如果连接已经建立,我可以处理它:) 非常感谢关闭;)
  • 不,两者的错误类型相同......我想我肯定会放弃 finally :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2014-11-13
  • 2018-09-19
  • 1970-01-01
相关资源
最近更新 更多