我在一些地方有一些带有各种“On Error Goto”错误处理程序的代码来处理一些破坏的第三方硬件。我在一个没有错误陷阱的例程中得到一个溢出错误(从Err变量中读取)但是由一个例程调用。我一直认为错误陷阱只在它们被声明的例程中有效,但看起来子例程中的错误可能导致它转到调用函数的错误陷阱。
所以我关闭了调用函数的错误陷阱,发现了我的溢出,一切都很顺利。但在我这样做之前,我花了一些时间试图找到一种编程方式让VB恢复到该例程中的默认错误处理(所以我不必修改外部代码来调试),但我不能。我能找到的唯一错误命令:
On Error GoTo [label] On Error Resume Next On Error Goto 0 On Error GoTo -1
全部打开手动错误处理 - 是否有办法将其关闭(返回VB6默认值)?
答案 0 :(得分:10)
在Error Handling Hierarchy下的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
然后你就可以编写像这样的错误处理程序了。
Private Sub Form_Load()
If Not InIDE() Then On Error Goto PreventCrashes
<lots of code>
Exit Sub
PreventCrashes:
<report the error>
End Sub
从here收缩。另一个提示 - 使用免费加载项MZTools自动添加这些样板错误处理程序。对于生产质量的代码,您可以更进一步,在每个例程中放置一个错误处理程序来创建ghetto stack trace。您也可以在每个错误处理程序中立即记录错误。
编辑:Ant已正确指出On Error Goto -1
是VB.Net statement,在VB6中无效。
编辑:Arvo和OneNerd已经写了一些有趣的讨论,在VB6错误处理中模拟了最终的拆卸块。 this question中的讨论也值得一看。
答案 1 :(得分:3)
有一种清晰简单的方法可以重置错误状态 - 使用关键字Resume。有三种可能性:
Resume
Resume Next
Resume <Label>
继续执行错误行,在下一行继续执行,最少谈话继续标签继续执行。在VB6中创建try-catch-finally类似的构造非常有用。从OneNerd借来并修改回答:
Function MyFunction() as String
'-- start of error block
'
On Error Goto Catch
' do something here that might cause an error
MyFunction = "IT WORKED"
Goto Finally
Catch:
' error occured - do something else
MyFunction = Err.Description
Err.Clear
Resume Finally ''added to clear error status
Finally:
On Error Resume Next ''added to avoid repeated errors
' put your finally code here
'
'-- end of error block
End Function
如果在Finally块中发生某些后续错误,则简单的Err.Clear没有帮助; Resume最后会重置内部错误状态。
答案 2 :(得分:1)
有一个方便的右键单击菜单,可让您打开和关闭错误处理。只需右键单击代码窗口并选择“切换”,然后就可以选择“中断所有错误”。这将导致禁用所有“On Error”语句。
答案 3 :(得分:1)
以下是我的工作:
如果有必要,首先启用 Sub Main()或 Sub Form_Load() Sub中的错误处理:
'-- turn on error handling
'
On Error GoTo 0
'
'-------------------------
现在会启用错误。
接下来,使用 On Error Resume Next 和 On Error GoTo {label} 命令以及 Err 对象。这是一个模拟try / catch / finally的例子:
Function MyFunction() as String
'-- start of error block
'
On Error Goto Catch
' do something here that might cause an error
MyFunction = "IT WORKED"
Goto Finally
Catch:
' error occured - do something else
MyFunction = Err.Description
Err.Clear
Finally:
' put your finally code here
'
'-- end of error block
End Function
答案 4 :(得分:0)
/工具/选项/常规/错误处理
答案 5 :(得分:0)
on error goto 0
应该是你想要的......它应该导致抛出的错误,反过来可能放松到RTL ......
已经很久了,但我很确定这就是你想要的。
on error resume next
将继续下一个声明,所以你需要有足够的
if err.Number <> 0 then
代码中出现错误的语句...
答案 6 :(得分:0)
必须同意LarryF, On Error Goto 0 应该关闭 On Error Resume Next 打开的显式错误处理。函数和子程序确实有自己的范围。来自Dr. Scripto at Microsoft:
接下来的错误恢复 脚本的开头,就像我们经常那样 做,使它适用于整个身体 的脚本。但是,正如我们将要看到的那样 后面的例子,它的范围没有 包括函数或子例程。如果 你想要处理一个错误 功能或子程序,你也必须 包括On Error Resume Next 他们在检查Err之前 对象
您可以关闭错误处理 On Error GoTo 0.所以有可能 使用On Error打开错误处理 在您想要之前继续下一步 检查Err对象,然后将其关闭 在On Error GoTo 0之后。
答案 7 :(得分:0)
没有“On Error GoTo -1”,所以我不知道你在哪里。
手册中非常详细地介绍了VB6异常处理。