我的Visual Basic 6程序(最初由别人编写)中出现了一个错误,其中设置了一个(全局)标志,应该在例程结束之前始终重置。有时(很少,不一致)它不是。据我所知,在查看了相关子程序后,它将始终在正常流程中重置。
我最好的猜测是这个标志是如何被左设置的,在调用函数中有错误处理(可能有很多)不正确地处理错误,可能是"Resume Next"。是否有任何方法可以阻止我感兴趣的子从传递错误到更高级别的处理程序,,同时还向我展示发生错误的行和原始错误?(显然,我可以将问题中的子标签包装在错误标签上,并有一个msgbox提示符,但这将使我非常失去实际错误发生的地方)
根据您最后的评论,您说有三个例程。由于这不是太麻烦,我建议使用以下模式:
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对象的属性保存为临时变量,并使用这些临时变量重新引发错误。然而,在这种情况下,由于设置布尔变量不会导致错误条件,因此在重新引发错误之前简单地重置标志是非常合理的。