类模块中断与未处理错误中断(VB6错误捕获,IDE中的选项设置)

时间:2012-10-02 08:45:24

标签: visual-studio vb6 error-handling compiler-errors compiler-options

基本上,我试图理解Visual Basic 6.0 IDE中以下路径中出现的“Break in Class Module”和“Break on Unhandled Errors”之间的区别:

Tools --> Options --> General --> Error Trapping

这三个选项似乎是:

  
      
  • 中断所有错误
  •   
  • 分类课程
  •   
  • 打破未处理的错误
  •   

现在,显然,根据MSDN,第二个选项(Break in Class Module)实际上只是意味着“打破类模块中未处理的错误”。此外,此选项似乎默认设置(即:我认为它设置为开箱即用)。

我想弄清楚的是,如果我选择了第二个选项,我是否可以免费获得第三个选项(打破未处理的错误)?那么,它是否默认包含在类模块频谱之外的所有场景中?建议,我目前活跃的项目中没有任何类模块。我有.bas模块。另外,是否有可能通过Class Mdules他们可能也指正常的.bas模块? (这是我的第二个子问题)。

基本上,我只是希望设置确保exe释放后不会有任何意外。我希望在开发时尽可能多地显示错误,并且在处于释放模式时不显示。通常,我的表单上有两种类型的On Error Resume Next,其中没有明确的错误处理,它们如下:

On Error Resume Next'REQUIRED On Error Resume Next'NOT REQUIRED

所需要的是,检查一个数组是否有任何长度,如果调用它的UBound错误,这意味着它没有长度,如果它返回0或更多的值,那么它确实有长度(因此,存在)。即使在我开发过程中,这些类型的错误语句也需要保持活动状态。但是,在我开发过程中,不需要的那些不应该保持活动状态,因此我将它们全部注释掉以确保我能够捕获所有存在的错误。

一旦我准备好发布exe,我会按CTRL + H查找所有出现的内容:

  

'On Error Resume Next'NOT REQUIRED

(您可能已经注意到它们已被注释掉了)......并将其替换为:

  

错误恢复接下来'不需要

...未注释的版本,因此在发布模式下,如果有任何剩余错误,则不会向用户显示。

有关MSDN对三个选项的描述的更多信息(我已经阅读了两次,但仍然找不到),您可以访问以下链接:

http://webcache.googleusercontent.com/search?q=cache:yUQZZK2n2IYJ:support.microsoft.com/kb/129876&hl=en&lr=lang_en%7Clang_tr&gl=au&tbs=lr:lang_1en%7Clang_1tr&prmd=imvns&strip=1

我也有兴趣听取你的想法,如果你想做志愿者(这将是我的暂定/完全可选的第三个子问题,那就是你对后备错误处理技术的看法)。

总结一下,前两个问题是,如果我们选择选项2,我们是否将选项3包含在所有非类场景中?而且,当他们使用术语“类模块”时,它们可能也指的是.bas模块吗? (因为.bad模块实际上只是一个在启动期间在后台预先实例化的类模块。)

谢谢。

2 个答案:

答案 0 :(得分:5)

我将从第一个选项开始。中断所有错误只会禁用错误处理程序。当您在输入错误处理程序后尝试进行调试时,这非常有用,因为您可能在处理程序本身中存在错误,或者当错误冒泡容器层数时,您可能会忘记错误发生的位置(错误不是在程序中处理尝试在调用过程中找到一个处理程序,如果你试图找到有问题的代码行,这可能会造成混淆。)

接下来,如果存在导致错误的代码行,则在未处理的错误中中断实际上不会在类模块中中断。如果您设置了此选项,并且在类中调用方法,并且方法中的代码行中存在错误,那么您将在客户端中具有方法调用的行中断。

类模块中的break会转到具有错误的类中的代码行。需要注意的是,如果您使用的是ActiveX EXE,则控制设置位于其项目中而不是客户端项目中。也就是说,您可以中断客户端项目中设置的所有错误,并中断ActiveX EXE项目中设置的未处理错误,并且您不会因为使用两个单独的进程而在类模块中中断。

我个人更喜欢将它设置为类模块中的break,因为它允许我以最精确的方式深入到错误的站点。这是在我开始做错误处理程序之前;在那一点上,我通常会在所有三个方面反弹,这取决于我想要稳定的东西。

最后,除了在内联错误处理的上下文中,我不推荐使用On Error Resume Next进行EVER。

答案 1 :(得分:4)

是的,当你选择“Break in class module”时,它仍会打破未处理的错误,但它也会破坏类模块本身未处理的类模块(不是普通模块)中的任何错误。

将此与“未处理的错误中断”进行对比,这将导致它在类中发生错误时退出类/用户控制代码,从而难以追踪确切的位置。

最好将其设置为“未处理错误中断”以进行一般开发,因为当您处理好的错误时,其他人会感到烦恼。请注意,最好在它们触发错误之前尝试检测这些。