on Error goto 放在for循环里的情况,假设处理1每次循环时都会发生错误,程序应执行处理2。
但只有第一次循环能捕捉到错误并且执行处理2,第二次就捕捉不到了。
莫非有次数限制?Private Function ActivityGen() 
    For     to 
        On Error Goto NextStep
        处理1
         ......        NextStep:
        处理2
        .....
      
    NextEnd Function

解决方案 »

  1.   

    Private Function ActivityGen() 
        For     to 
            On Error Goto NextStep
            处理1
             ......
            
            On Error Goto 0 '关闭错误处理
            NextStep:
            处理2
            .....
          
        NextEnd Function
      

  2.   

    我试了一下,没有用。抱歉,想当然了.
    Private Sub Command1_Click()
    Dim i As Long
    Dim b As Long
    Dim c As Long
        c = 5
        For i = 1 To 10 
            On Error GoTo NextStep
            c = c / b        On Error GoTo 0 '不管有没有此句,都是“除数为零”的错误
    NextStep:
            c = 5
        Next
    End Sub
      

  3.   

    On Error GoTo 0 这句要写也应该写在NextStep:之后 ^v^.
    from MSDN
    如果在错误处理程序处于活动状态时(在发生错误和执行 Resume、Exit Sub、Exit Function 或 Exit Property 语句之间这段时间)又发生错误,则当前过程的错误处理程序将无法处理这个错误。
      

  4.   

    哈,恭喜.  接分
    -----------
    www.vicmiao.com
    努力就有美好時光!
      

  5.   

    windows采用seh机制捕获错误.
    struct exception handler 提供一套从异常运行恢复的机制.
    cpu一旦产生一个异常,则会通知系统, 系统调用fs:[0]处理函数,然后根据函数
    返回值, 来确定是被处理(可以在处理函数中改变content的eip的值), 还是继续搜索下一个
    seh链,或者产生一个unhandler exception. 理解这段话系统的调用过程, 
    对你理解vb中on error很有帮助映射到vb中, 则是on error错误陷阱处理.
    vb中提供了3个声明来设置错误陷阱.
    On Error GoTo line     '如果错误产生, 则跳转到某行,或者标号执行
    On Error Resume Next   '如果错误产生, 则继续下一条语句
    On Error GoTo 0        '清除当前设置的错误陷阱
    一个声明来处理陷阱.
    Resume                 '执行完错误例程, 跳转到字程序. msdn:
    在一个过程中可设置多个陷阱, 但只有最后一个设置覆盖前面的,并且"enable"的.
    同时, 在任何一个过程中, 错误存在两种情况, 一种是active, 表示正在
    处理错误中, 另外一种是没有产生错误.Resume (可跟2个参数, next表示继续出错后的下一条语句, 或一个标号返回到指定标号)
    只能在错误active的时候运行.
    On Error GoTo 0 清楚错误陷阱, 那么就没有任何陷阱是enable了, 那么产生错误就捕捉不到了在同一个过程中
    满足错误捕获必须满足2个条件. 一个是有错误陷阱是enable, 同时错误状态不是active.
    这样的目的是防止错误捕捉死循环.很明显进入enable的条件是设置错误陷阱
    On Error Resume Next
    On Error GoTo line 
    退出enable的条件是退出了过程, 或者执行了 On error goto 0进入active的过程是产生了错误.
    退出active的过程是执行了Resume错误其实是一个子代码段调用. 由On Error Goto..进入, resume返回(可指定返回地址)
    在调用中, active是true的.
    On Error Resume Next 是On Error Goto xxx + Resume Next的一个特例,
    表示产生了一个空的字代码调用. 所以active始终是false的.如果系统发现当前过程的错误是active的, 或者当前过程没enable错误陷阱, 则会从
    call stack中向上展开寻找,  如果找不到可处理的错误陷阱, 则调用vb默认的错误
    陷阱, 即弹一个runtime错误的对话框, 然后退出程序.OK, 回到你这个例子
    你在循环中设置错误陷阱, 那么每次循环都会设置这个错误陷阱.
    按照前面的说明, 那么会存在错误覆盖, 所以不需要这么写. 改成如下Private Sub Command1_Click()
    On Error GoTo NextStep
    Dim i As Long
    Dim b As Long
    Dim c As Long
        c = 5
        For i = 1 To 10 
    ..............你并不需要让错误陷阱disable, 所以不需要执行
    On Error Goto 0 '关闭错误处理,  这句删除.on Error goto NextStep
    这是一个错误处理例程, 所以你需要resume掉, 以便让active为false,以便在该过程中
    能继续处理错误, 由于是例程子调用, 所以需要把这个NextStep写在函数的最后, 
    由于你不需要做任何处理, 仅仅是会到写一条语句, 所以可以这么
    NextStep:
    Resume next完整代码如下:Private Sub Command1_Click()
    Dim i As Long
    Dim b As Long
    Dim c As Long
    On Error GoTo NextStep
        c = 5
        For i = 1 To 10 
            
            c = c / b       c = 5
        Next
        exit sub NextStep:
        resume next
    End Sub这就是最标准的写法
    同样,由于你的NextStep子处理列程不做任何事, 可以简写成On Error Resume Next
    最终修改代码如下Private Sub Command1_Click()
    Dim i As Long
    Dim b As Long
    Dim c As Long
    On Error resume next
        c = 5
        For i = 1 To 10 
            
            c = c / b       c = 5
        Next
    End Sub
      

  6.   

    错误陷阱打开了enable了, 才可以捕获陷阱.
    可能有点没说明白:
    为什么active中(错误处理列程中)不能在同一个过程中再次捕获陷阱.
    由于错误捕获函数是系统调用fs:[0]的, 所以在错误例程中,
    也就是fs:[0]这个函数中, 也就是你On Error goto xxx的那个xxx开始的地址中
    如果产生了错误, 系统是不可以再去调用fs:[0]的, 因为这就形成了递归死循环.
    所以没有Resume的时候,即没从那个函数ret到系统中去的话, 是不可以再次重入这个函数的
    系统的解决方案是继续搜索seh联.
    seh是一个连表的形式保留. 前4个字节表示上一个连的seh地址.
    也就是上层call设置的seh连. 这就是为什么在active的时候, 系统会搜索上层调用
    设置的on error goto..陷阱了.
      

  7.   

    试了一下resume next,very good!
      

  8.   

    TO pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 
    道理讲得很清楚,谢!只是你把我的程序逻辑改了,解决不了任何问题.首贴麻烦再看一下啊
      

  9.   

    TO pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 不好意思,试了一下,果然好用。小问题给想复杂了,不过深入学了习VB的错误处理方面的知识。感谢各位,给分。
      

  10.   

    pigsanddogs说得很清楚了,On Error Goto语句不适合你的逻辑。如果你不想修改的话,可以使用Err对象Private Function ActivityGen() 
        For     to 
            if Err.Number<>0 then
               Err.Clear        处理2
            .....
            Else
            处理1
             ......
            End if      
        NextEnd Function
      

  11.   

    各位仁兄还是差一点啊。在如下的例子中
    Private Function ActivityGen() 
        For     to 
            On Error Goto NextStep
            处理1
             ......
            xxxxxxxxxxxxxxxxx        NextStep:
            处理2
            .....
          
        Next
    End Function之所以把On Error Goto NextStep和NextStep:放在for循环内部,是因为想在出错时,跳过xxxxxxxxxxxxxxxxx部分,可是用了resume next之后,xxxxxxxxxxxxxxxxx还会照样执行。
    这不是我想要的。
      

  12.   

    晕,你的逻辑不适合使用On Error Goto模式的,我已经给了你一种解决方案了。
      

  13.   

    谢各位if Err.Number<>0 thenend if这个好用