用于确定VBA中当前错误处理方法的语法

时间:2015-01-29 15:57:47

标签: vba

在我的代码中的任何给定行上,我可以将Debug.Print()与其他命令一起使用,以找出如果我的代码在该行上遇到错误会发生什么?

我可以使用Debug.Print中的任何语句来查明当前的错误处理程序是转到0,继续下一步还是转到某些标签?

我想象的是:

Debug.Print(OnErrorMode)

我正在寻找一种方法来确定错误的特定代码行是GoTo 0(停止并显示错误),Resume Next(跳过该行)还是GoTo Label(鉴于On Error可能被埋在我的代码中某处,我无法找到,因此请跳转到Label。这可能吗?

1 个答案:

答案 0 :(得分:6)

在使用VBA和VB(5和6)的十多年中,我有从未见过一个甚至远程建议可以确定存在什么错误捕获条件的引用。虽然编译器肯定知道,但它没有暴露。

在我看来,您的问题可能与您如何构建错误陷阱有关。

我将子程序包装在一个On Error Goto语句中,该语句位于与On Error相同的子程序中。我有一个退出,当错误发生时,我记录发生了什么,所以我可以修复错误。然后,我可以使用debug.print或创建一个字符串,其中包含附加到日志中的调试信息。

Sub main()
         On Error GoTo Main_Error
         'Insert Code Here
         Exit Sub
         Main_Error:
         WriteLog Err.Number, Err.Description
        MsgBox ("The program encoutnered an error.")
    End Sub
    Private Sub WriteLog(ErrNum As Integer, ErrDes As String)
        Open "Errors.txt" For Append As #1
        Print #1, Now & "  " & ErrNum & " - " & ErrDes
        Close #1 
    End Sub

我使用的第二种模式是在很可能发生错误的区域,例如打开文件(文件可能丢失)或数据库。然后我像使用try catch块一样使用错误捕获。

Private Function LoadFile() As Boolean
    On Error GoTo Main_Error
    'Code before a potentially error-prone statement
    On Error Resume Next
    Open "aMissingFile.txt" For Input As #1
    If Err.Number <> 0 Then
        MsgBox ("aMissingFile.txt is missing")
        LoadFile = False
        Exit Function
    End If
    On Error GoTo LoadFile_Error
    'The rest of your code
    LoadFile = True
    Exit Function
LoadFile_Error:
    WriteLog Err.Number, Err.Description
    MsgBox ("The program encoutnered an error.")
    LoadFile = False
End Function

这使得处理错误变得更容易,并且调试就像注释掉一个On错误语句一样简单。请注意,err.number列出了错误代码返回,因此您可以添加逻辑来处理不同类型的错误。