Fre*_*ton 8 vb6 error-handling
我在一些地方有一些带有各种"On Error Goto"错误处理程序的代码来处理一些破坏的第三方硬件.我在一个没有错误陷阱的例程中得到一个溢出错误(从Err变量中读取),但是由一个例程调用.我一直认为错误陷阱只在它们被声明的例程中有效,但看起来子例程中的错误可能导致它转到调用函数的错误陷阱.
所以我关闭了调用函数的错误陷阱,发现我的溢出,一切都很好.但在我这样做之前,我花了一些时间试图找到一种编程方式让VB恢复到该例程中的默认错误处理(所以我不必修改外部代码来调试),但我不能.我能找到的唯一错误命令:
On Error GoTo [label] On Error Resume Next On Error Goto 0 On Error GoTo -1
所有打开手动错误处理 - 是否有办法将其关闭(返回到VB6默认值)?
Mar*_*rkJ 10
在错误处理层次结构下的VB6手册中对此进行了详细说明.On Error Goto 0禁用当前过程中的错误处理程序,而不是在调用它的过程中.
如果过程中发生错误并且此过程没有启用的错误处理程序,Visual Basic将向后搜索调用列表中的挂起过程 - 并执行它找到的第一个启用的错误处理程序.如果它在调用列表中的任何位置都没有遇到启用的错误处理程序,则会显示默认的意外错误消息并停止执行.
正如其他人所说,您可以转到" 工具 - 选项 - 常规"选项卡,然后选择" 中断所有错误".这有效地禁用了所有On Error语句 - IDE将在每次错误时立即中断.
如果你的VB6代码在正常操作中抛出错误,这可能会令人恼火.例如,当您检查文件是否存在,或者用户在常用对话框中按取消时.您不希望IDE每次都在这些行上中断.但是,您可能在所有事件处理过程中都有样板错误处理程序,以阻止程序因意外错误而崩溃.但是当你调试问题时它们会很麻烦,因为IDE不会因错误而中断.一个技巧是在IDE中运行时关闭这些错误处理程序,但将它们保留在构建的可执行文件中.你这样做.
将这些功能放入模块中.
Public Function InIDE() As Boolean
Debug.Assert Not TestIDE(InIDE)
End Function
Private Function TestIDE(Test As Boolean) As Boolean
Test = True
End Function
Run Code Online (Sandbox Code Playgroud)
然后你可以编写像这样的错误处理程序.
Private Sub Form_Load()
If Not InIDE() Then On Error Goto PreventCrashes
<lots of code>
Exit Sub
PreventCrashes:
<report the error>
End Sub
Run Code Online (Sandbox Code Playgroud)
从这里挤压.另一个提示 - 使用免费的插件MZTools自动添加这些样板错误处理程序.对于生产质量的代码,您可以更进一步,在每个例程中放置一个错误处理程序来创建贫民窟堆栈跟踪.您还可以在每个错误处理程序中立即记录错误.
编辑:Ant已正确指出这On Error Goto -1是一个VB.Net语句,在VB6中无效.
编辑:Arvo和OneNerd已经写了一些有关在VB6错误处理中模拟最终拆卸块的有趣讨论的答案.这个问题的讨论也值得一看.