【问题标题】:VB6 debugging- doesn't go to error handling codeVB6 调试 - 不去错误处理代码
【发布时间】:2011-03-07 04:18:29
【问题描述】:

我正在维护一个 vb6 项目(ActiveX DLL)。调试时,app运行如下函数:

Public Function HasValue(ByVal vValue) As Boolean

    On Error GoTo Err

    If IsMissing(vValue) Then
        HasValue = False
    ElseIf IsNull(vValue) Or Len(vValue) = 0 Then
        HasValue = False
    ElseIf isEmpty(vValue) Then
        HasValue = False
    Else
        HasValue = True
    End If

Exit Function

Err:

    If IsArray(vValue) Or IsObject(vValue) Then
        HasValue = True
    Else
        HasValue = False
    End If
End Function

它停在该行

ElseIf IsNull(vValue) 或 Len(vValue) = 0 Then

vValue 是一个自定义对象,包含一些属性(显然,不为空)。

虽然我没有在此处放置任何断点,但应用程序停在那里并警告错误对话框说“运行时错误'438':对象不支持此属性或方法”。

我们有错误处理代码,但应用程序没有运行到错误处理代码。它只是停在导致错误的行,我不得不停止应用程序。

你对此有什么想法吗? 非常感谢。

【问题讨论】:

  • 何:把Or Len(vValue) = 0的部分去掉再试试。
  • 关于这个问题的一些事情会混淆这个问题。 1.它使用IsMissing,但vValue没有声明为OptionalIsMissing 用于检测未传递给方法的Optional Variant 参数。 2. 您的 cmets 说 vValue 是一个对象,但代码使用 IsNullLen 对其进行测试。对象引用使用Is Nothing 进行测试。这段代码是逐字发布的,还是被隐藏了?
  • 是的,代码是从我正在维护的应用程序中逐字复制的。我对开发人员实施的方式感到非常惊讶。无论如何,请忽略这里的逻辑。我只是想知道为什么该应用程序不会遇到错误处理代码。谢谢

标签: dll vb6 activex


【解决方案1】:

就在调试器中运行弹出窗口而言,它可能与您在 IDE 中的“错误捕获”设置有关。转到工具->选项->常规,然后查看“错误捕获”下选择的内容。乍一看,您的错误处理程序在发生错误时测试 vValue 似乎很奇怪。基于我对这种方法的有限理解,将 IsArray 和 IsObject 条件都移到主要测试逻辑中,这对我来说更有意义。只是我的 2 美分 :)

【讨论】:

  • 您也可以通过在代码窗口中单击鼠标右键,然后查看弹出菜单上的“切换”项来检查错误捕获设置。
【解决方案2】:

据我所知,vb6 不支持 boolean short evaluation in

 ElseIf IsNull(vValue) Or Len(vValue) = 0 Then

所以即使IsNull(vValue) 为真,Len(vValue) = 0 也会被执行。

将代码更改为

...
ElseIf IsNull(vValue) Then
    HasValue = False
ElseIf Len(vValue) = 0 Then
    HasValue = False
ElseIf ...

可能会解决问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多