如何在VB6中重新启用默认错误处理

时间:2009-04-10 01:15:57

标签: 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默认值)?

8 个答案:

答案 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 -1VB.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异常处理。