曾经遇到过一个问题,在错误处理中使用Debug.Print打出来的err.Number居然是0(当然,在这段错误处理的代码之前已经加了Exit Sub)。如下:
    Set clientCs=nothing '调用中间层的对象被释放
    Set Rs=nothing '客户端记录集被释放
    debug.print err.Number
后来我把两个变量清空的语句放到debug的下面就返回了正确的出错信息。有点不明白,难道说把中间层对象或记录集清空的同时也会清空Err对象吗?究竟在什么条件下Err会被清空呢?
    

解决方案 »

  1.   

    MSDN中的说明:
    The Err object's properties are reset to zero or zero-length strings ("") after an Exit Sub, Exit Function, Exit Property or Resume Next statement within an error-handling routine
      

  2.   

    Err 对象
                   含有关于运行时错误的信息。说明
    Err 对象的属性由错误的生成者来设置,这个生成者或者是 Visual Basic,或者是对象,或者是程序设计员。Err 对象的缺省属性是 Number。因为该缺省属性可以用对象名称 Err 表示,所以不必修改以前用 Err 函数或 Err 语句书写的代码。当运行时错误发生时,Err 对象的属性被填入明确识别错误的信息以及处理这个错误所使用的信息。为了在代码中生成运行时错误,请用 Raise 方法。在任意形式的 Resume 或 On Error 语句之后以及在错误处理子程序内的 Exit Sub、Exit Function、或 Exit Property 语句之后,将 Err 对象的属性重新设置为零或长度为零的字符串 ("")。可使用 Clear 方法重新明确设置 Err 。为了对系统错误和类模块生成运行时错误,要使用 Raise 方法而不使用 Error 语句。在其它代码中是否使用 Raise 方法,这要看想要返回的信息量有多大。Err 对象是具有全局范围的固有对象。在代码中没有必要建立这些对象的实例。
      

  3.   

    在Err, Erl Functions中有如下描述:CautionIf you set up an error handler using On Error GoTo and that error handler calls another procedure, the value of Err and Erl may be reset to 0. 这里是不是说在调用其它过程时可能发生错误号清零的情况?在我上面的例子中就是
    Set clientCs=nothing 时clientCs的Terminate事件被调用的情况?
      

  4.   

    当你的父过程结束时(如果你没有清0,这时Err.Number才为0)
    你调用的子过程出错了在父过程中仍可以用Err.Number得到错误号
      

  5.   

    同意整栋楼的朋友。
    简单说:整个过程结束时错误号会自动清零,如果是调用子过程,则等到父过程完成,除非你在子过程或其他地方使用了Err.Clear。
      

  6.   

    Set clientCs=nothing '调用中间层的对象被释放
    set Rs=nothing '客户端记录集被释放
    以上两句,应是原因。
    在两个类的释构函数中,应该出现了On error goto , on error resume next 或 Resume "XXXX" 方法
      

  7.   

    搞定了,其实是中间层的错误处理语句发生了问题,但是VB如果在错误处理中发生了问题是不可能被错误捕获的.于是中间层被当掉,客户端的错误处理中就出现了Err.number=0的现象.感谢楼上朋友们的回复...