上次这个帖子结贴了,只好发个新帖。看MSDN里的话:Private Sub Class_Terminate()
   On Error Resume Next
   Debug.Print "Terminate Thing " & DebugID _
      & ", Name=" & Name
End SubImportant   You should always handle errors in the Class_Terminate event procedure. Errors in Class_Terminate cannot be handled by applications that use your component, and will therefore be fatal to the application.请问为何说“Errors in Class_Terminate cannot be handled by applications that use your component”?

解决方案 »

  1.   

    On Error Resume Next
    对这个sub的On Error Resume Next以下的语句(和子sub、function)起作用。
      

  2.   


    Option ExplicitPrivate Sub Form_Load()
    On Error GoTo err
            Dim cls As New Class1
            
            cls.xx
            
            Set cls = Nothing
            Exit Sub
    err:
            Debug.Print 1
    End Sub
    Option ExplicitPublic Sub xx()
    'On Error GoTo err
            Debug.Print 1 / 0
            Exit Sub
    'err:
    '        Debug.Print 2
    End Sub那段话大概可以用这样一个例子来解释,有没有注释执行效果是完全不同的。
      

  3.   

    你个楼主 你就只谢老张!!!楼主 你个瓜瓜!!!!!让我解释一下 那些晦涩难懂的句子。意思就是:有些错误的产生并不是用on resume next 就能有搞定的。
    比如有些部件产生的错误。
    举个例子:你只在VB的图上 画上了个MSCOMM1 ,假如你程序中写上了MSCOMM2,那么如果当运行到这句ON ERROR RESUME NEXTmscomm2.comport = 1仍然会出现错误。是个fatal的错误-------------------- 致命!!
      

  4.   

    unsv29,我没觉得这些句子晦涩啊。这些类本来就是在讲组件里的类,老张讲的对路呢。怪我没把MSDN里的出处交待清楚。我在这里看到的:mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2001OCT\1033\vbcon98.chm::/Html/vbconaddingcodeforinitializeterminateevents03.htm
      

  5.   

    你给的链接大概只有你自己能打开吧
    我觉得这段话就是我上面所讲的。请楼主 翻译一下这段话到底是什么意思???直译就好!!不要加上自己的想象。You should always handle errors in the Class_Terminate event procedure. Errors in Class_Terminate cannot be handled by applications that use your component, and will therefore be fatal to the application. 
      

  6.   

    0楼的话来自《Components Tools Guide》
      

  7.   

    回11楼:翻译:
    你应该始终在 Class_Terminate 事件过程里处理异常。Class_Terminate 里的异常无法被使用你的部件的应用程序处理,因此这种异常(如果不在Class_Terminate 事件过程里处理的话)对应用程序就会是致命的。举例
    比如说,你开发了一个ActiveX控件,供Project1使用。你的控件里的类的Class_Terminate里的错误就不能被Project1处理,必须在类的Class_Terminate里处理。
      

  8.   

    就是说类内部的错误,有时不会被raise到类外部调用,在类外部无法捕获,进而需要在类内部处理。
      

  9.   

    那楼上说说 :我的例子就不靠谱?举个例子:你只在VB的图上 画上了个MSCOMM1 ,假如你程序中写上了MSCOMM2,那么如果当运行到这句 ON ERROR RESUME NEXT mscomm2.comport = 1 仍然会出现错误。 是个fatal的错误-------------------- 致命!! ==========================
    ================================
    ====================================请问我举个这个例子中出现的 ON ERROR RESUME NEXT 不能处理的错误 是怎么个情况???
    请解释一下!!!!
      

  10.   

    和我说的不是一回事。如果你真有心,去找MSDN的相关段落看一下再来讨论可好。我的MSDN是英文版的,你可用13楼Tiger_Zhao贴出的MSDN中文到你的MSDN里去搜索定位合适的段落。大致是在《部件工具指南》那本书里。
      

  11.   

    20楼是回给18楼的。另外,蚜虫,我早上才看到的,至少Class_Initialize事件里的错误是可以被客户端捕获的。
      

  12.   

    另外,18楼,如果你英文还可以,我这里有个学习笔记也可以供你参考:http://blog.csdn.net/slowgrace/archive/2009/06/09/4253424.aspx可以看一下其中的“2. Error Handling Hierarchy”和“6. Error Handling with ActiveX Components”
      

  13.   

    了解
    我也是写一个程序的时候忽然发现在类内部触发错误,外面捕捉不到(3楼那种)。Initialize事件倒没注意。
      

  14.   

    好像不是一回事
    3楼AisaC贴出来的那种,无论on error goto 还是 resume next,都处理不了类内部发生的错误。
      

  15.   


    你说的对,刚才试了。不能捕获的错误,即使Resume Next也还是会有致命错。另外,我还试了Class_Initialize事件,它里面的错误是可以被外部进程捕获的。
      

  16.   

    NO,3楼代码外部可以捕获错误,注意 VB-IDE 的调试选项要选 Options\General\Error Trapping\Break on Unhandled Errors
      

  17.   


    貌似不能的,我本来就是这么设置的。Class_Terminate事件里的错误外部不能捕获。如果你是说其他事件里的错误,那么它是可以捕获的(我试了Class_Initialize事件)。
      

  18.   

    我觉得是因为Class_Initialize一旦发生,表明对象开始销毁,无法挽回,这时候丢出异常会出现混乱——是否还继续销毁对象呢?而且VB的组件是标准的COM组件,Class_Initialize类似析构函数,然而在不同的语言,异常处理不兼容,为了保持兼容性,不得不放弃对Class_Initialize抛出异常的支持。
    以上只是猜测,总之lz很细心,的确不能在Class_Initialize向外抛出异常。
      

  19.   

    Terminater事件是在对象的引用计数为0时由vb运行环境在销毁对象前自动执行的,当时不在任何一个用户子程序环境中,不知道堆栈的情况,不知道当前的enabled error handler是哪一个。所以,即使有对象外部有on error goto 或 on error resume 也不能捕获这样的错误,从而对应用是致命的。所以,只能在terminate事件内部处理。所以,Terminal事件外的其它时间不存在这样的无法捕捉的情况。
      

  20.   

    所以,Terminal事件外的其它事件不存在这样的无法捕捉的情况。
      

  21.   

    MSDN已经强调了:调用堆栈如果由于你的代码显式释放对象,触发 Class_Terminate,它的错误可以被你捕获。
    如果由于外部调用引起隐式释放对象,触发 Class_Terminate,它的错误不能被你捕获。
      

  22.   

    本质上无所谓显式和隐式,显式只是set obj=Nothing,隐式只是out of scope,
    反正都是引用计数减一。vb只是由引用计数为0来销毁对象。即使是显式释放,一样不能捕获
    terminate事件中的错误,因为此种情况下,仍然是vb运行环境来调用terminate而不是用户程序。
      

  23.   

    42楼说得没错,显式释放也是间接触发 Class_Terminate,错误一样不能被捕获。
      

  24.   

    On Error Goto slowgrace
      

  25.   

    关于那个帖子,wangmu的回答可能大家都没看到,我贴在这里,如果程序中使用了多个同一个类型的对象,它们的err.number,err.source等都是相同的,在errorhandler中难以区别是程序中具体哪一个对象引发的。而用on error resume next,就能解决这个问题。大家觉得有道理不?
      

  26.   

    原贴:
    为什么访问对象时,要用on error resume next 而不能用 on error goto 呢?
    此贴:
    再问 On Error Resume Next
    引自MSDN的英文选段:
    Important  You should always handle errors in the Class_Terminate event procedure. Errors in Class_Terminate cannot be handled by applications that use your component, and will therefore be fatal to the application. 1、原贴内容谈的是on error goto 与 on error resume next区别;
    2、本贴题目给人第一感觉就是原贴的延伸;
    3、英文的内容指的是类内部错误处理,英文最后还有一问,本贴目前讨论的主要就是针对英文内容的;由上面4点可以看出,本贴有两个问题:
    1、on error goto 与 on error resume next
    2、类内部错误处理;那标题还合适吗?
      

  27.   

    个人觉得这种问题没必要进行极其的深入的讨论。无论是Goto还是Resume,只要有一个能满足自己程序的需求,就可以了。     也许是我才疏学浅的表现,不苟同的就当我放了个P,不闻不理就是了。
         嘿嘿。