如果不提供错误处理方法,
其它与之相关的还有:
上面各种语句的组合可以非常复杂。下面是我半天时间的研究成果。 1.VBA处理出错的两种方式设置 Sub Demo1() On Error Resume Next Call doing_thing1 If Err.Number > 0 Then Call err_handler1 ' err handler deals with err in doing_thing2 Err.Clear End If Call doing_thing2 If Err.Number > 0 Then Call err_handler2 ' err handler deals with err in doing_thing2 Err.Clear End If On Error GoTo 0 Call doing_next_thing End Sub
Sub Demo2() On Error GoTo err_handler_line1 Call doing_thing1 On Error GoTo err_handler_line1 Call doing_thing2 On Error Resume Next ' On Error Resume Next和 On Error Goto可以混着用 Call doing_next_thing Exit Sub err_handler_line1: Call err_handler1 Resume ' return and re-run the error line ' 上面一行Resume、Resume Next、Exit Sub可根据情况任选其一 ' 而且必须选一个,否则doing_thing1出错时,下面的Err_hander2也会被运行 err_handler_line2: Call err_handler2 Resume Next ' resume to next of the error line End Sub 2.Err变量VBA有一个全局变量
Sub Demo3() On Error Resume Next Call doing_thing '?如果此处出错,Err将保存错误信息 On Error Resume Next ' 此处Err对象被清空 If Err.Number > 0 Then Call err_handler ' 由于Error被清空,此处错误处理程序已经失效。 Err.Clear End If Call doing_next_thing End Sub Err是全局变量,母函数的错误信息会带入到子函数,子函数的错误信息也会被返回母函数。但实际表现非常复杂,具体请参考本文第五部分。 3.isErrorHanderEnabledVBA里对错误处理有两个状态。一个是
4.isErrorHanderActive
和 需注意 Sub Demo5() Dim i As Long On Error Resume Next i = 1 / 0 ' err occurs MsgBox "Here: Err.Number > 0 but isErrorHanderActive = False" On Error GoTo err_handler: i = 1 / 0 ' err occurs, set isErrorHanderActive = True err_handler: On Error Resume Next ' this will clear err MsgBox "Here: Err.Number = 0 but isErrorHanderActive = True" End Sub 5.函数调用时发生什么?VBA的子函数和母函数在处理错误之间的关系比较复杂。一般情况尽量让各自函数处理各自的问题,避免子函数将错误抛给母函数。 |