2011-03-07 78 views
2

我正在维护一个vb6项目(ActiveX DLL)。在调试时,该应用程序运行到下面的函数:VB6调试 - 不会去错误处理代码

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然后

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

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

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

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

+1

何:拆除部分'或者莱恩(VVALUE)= 0',然后尝试。 – Mudassir 2011-03-07 04:31:49

+0

关于这个问题有几件事会混淆这个问题。 1.它使用'IsMissing',但'vValue'没有声明为'Optional'。 'IsMissing'用于检测没有传递给方法的'Optional Variant'参数。 2.你的意见说'vValue'是一个对象,但代码使用'IsNull'和'Len'来测试它。对象引用使用'Is Nothing'进行测试。这段代码是逐字地发布的,还是被模糊了? – JeffK 2011-03-07 15:44:33

+0

是的,代码是从我维护的应用程序逐字复制的。我对开发者实施的方式感到非常惊讶。无论如何,请忽略此处的逻辑。我只是想知道为什么应用程序不会遇到错误处理代码。谢谢 – nobitavn94 2011-03-09 06:21:46

回答

6

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

+0

+1也将Len测试移动到例程的末尾 – MarkJ 2011-03-07 09:07:36

+0

您也可以通过在代码窗口中右键单击,然后查看弹出菜单上的“Toggle”项来检查错误陷印设置。 – JeffK 2011-03-07 15:48:20

0

据我所知VB6不支持布尔较短的评估

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

所以Len(vValue) = 0执行即使IsNull(vValue)是真实的。

改变你的代码

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

可能会解决这个问题