2014-06-13 75 views
1

我的Visual Basic 6程序(最初由其他人编写)中发生了一个错误,其中(全局)标志被设置为应始终在例程。有时(很少,很常见)它不是。据我所知,它将始终在正常流程中重置,查看子问题。防止Visual Basic 6中的调用程序错误捕获

我最好的猜测是这个标记是如何设置的,是在调用函数(可能有很多)中有错误处理,可能是用“Resume Next”错误处理错误。有没有什么办法可以阻止我感兴趣的sub从错误传递到更高级别hander,,同时还向我显示错误发生的线路和原始错误? (很明显,我可以将问题包装在On error标签中并且有一个msgbox提示符,但是这会让我相当迷失于发生实际错误的位置)

+2

为什么不把一个监视变量打破,如果它改变,你不是在正确的状态? –

+0

它经常变为有用的 - 会一直打破 - 而且它的错误在于* not * changins。 – CMaster

+0

这是你正在谈论的一个例程吗?或者一些不同的例程,都使用相同的标志设置/重置? –

回答

1

通过您最近的评论,您说有三个例程。由于这是不是太苛刻,我会建议使用以下模式:

Sub Routine_n() 

    On Error GoTo ErrorHandler 

    ... code ... 

    g_bGlobalFlag = False 

Exit Sub 

ErrorHandler: 
    g_bGlobalFlag = False 
    Err.Raise Err.Number, Err.Source, Err.Description 
End Sub 

有关添加代码错误处理程序通常的危险是,你无意中重置Err对象。对此的响应是将Err对象的属性保存到临时变量,并使用这些临时变量重新调整错误。但是,在这种情况下,由于设置布尔变量不会导致错误情况,因此在重新设置错误之前简单地重置标志是非常合理的。

+0

如果我的猜测是正确的,那么这将是一个(哈克)解决问题的方法。然而,正如它运行的“全部休息”显示,没有例外,处理或其他。 相反,问题原来是一个带有“DoEvents”的超时循环,让另一个例程中断而不接管。去除可诅咒的DoEvents解决了这个问题(和其他几个问题) – CMaster

+0

唉! DoEvents是邪恶的! –