当函数中发生错误时,我想知道导致它的事件序列,特别是当从十几个不同的地方调用该函数时.有没有办法在VB6中检索调用堆栈,或者我必须以艰难的方式执行它(例如,每个函数和错误处理程序中的日志条目等)?
你必须做硬盘的方式,但它是不是真的是辛苦......严重的是,一旦你写的模板一次,这是一个快速复制/粘贴/修改函数名在Err.Raise语句相匹配到实际的功能名称.
Private Function DoSomething(ByVal Arg as String) On Error GoTo Handler Dim ThisVar as String Dim ThatVar as Long ' Code here to implement DoSomething... Exit Function Handler: Err.Raise Err.Number, , "MiscFunctions.DoSomething: " & Err.Description End Function
当你有嵌套调用时,这会在每个例程命中其Handler并将其名称添加到错误描述时展开.在顶级函数中,您将获得一个"调用堆栈",其中显示了被调用的例程列表,以及实际发生的错误的错误号和描述.它并不完美,因为你没有获得行号,但我发现你通常不需要它们来找到解决问题的方法.(如果你真的想要行号,你可以把它们放在函数中,并使用Erl变量在Err.Raise语句中引用它们.没有行号,只返回0.)
另外,请注意,在函数本身中,您可以使用消息中有趣变量的值来引发自己的错误,如下所示:
Err.Raise PCLOADLETTER_ERRNUM, , "PC Load Letter error on Printer """ & PrinterName & """"
(语法高亮显示在预览中看起来很糟糕...我想知道它在发布后会是什么样子?)
我很确定你必须以艰难的方式去做.在我以前的工作中,我们使用DCOM组件对VB6进行了非常优雅的错误处理过程.但是,必须将大量冗余代码添加到每个方法中,以至于我们使用本土工具为您插入所有这些代码.
我无法提供太多关于其实施的见解(因为我已经忘记了大部分内容并且他们有可能将其视为商业秘密).确实突出的一点是方法名称无法在运行时派生,因此它被添加为字符串变量(一些开发人员将复制粘贴而不是使用该工具,这将导致错误堆栈的谎言. ..).
HTH