我如何使用On Error GoTo?

时间:2016-04-23 06:12:19

标签: excel vba excel-vba excel-2016

我认为vba IDE不允许正确打破错误。我在这里询问了如何识别运行时错误的问题:

How do I break on errors?

解决方案/解决方法似乎是使用On Error GoTo或类似方法。我正努力做到这一点,但没有取得多大成功。

根据Microsoft Function generateTimeseries() As Variant On Error GoTo ErrorHandler Dim currentArray As Range currentArray = Selection.Range ' this doesn't work - I don't care why generateTimeseries = currentArray.Rows Return ErrorHandler: Debug.Assert False Resume ' break here if you want to catch errors End Function ,当发生运行时错误(https://msdn.microsoft.com/en-us/library/5hsw66as.aspx)时,它会将您发送到指定的区域代码。根据我的经验,这不是整个故事。这个问题是关于如何实际使解决方案有效。

所以我有以下功能:

ErrorHandler

此功能永远不会输入Selection.Range代码。相反,它会落在#VALUE上,函数只返回 List commands = new ArrayList(); commands.add("C:\\Program Files\\Java\\jdk1.7.0_79\\bin\\java.exe"); commands.add("version"); ProcessBuilder pb = new ProcessBuilder(commands); System.out.println("Running command"); Process process = pb.start(); int errCode = process.waitFor(); System.out.println("command executed, any errors? " + (errCode == 0 ? "No" : "Yes")); System.out.println("Output:\n" + output(process.getInputStream())); 。我实际上并不关心为什么这会中断,我只是想知道如何让IDE告诉我它实际上已经落在那条线上,没有我手动跳过代码。

2 个答案:

答案 0 :(得分:1)

我刚刚测试过你的错误处理程序,它在

上正确破解
Debug.Assert False

- >检查调试器选项。

然而,这不是处理vBA中错误的正确方法,因为如果编译应用程序并忘记调整此类错误处理程序,当用户在过程中遇到错误时,应用程序将陷入无限循环。

在大多数情况下,您必须抛出一个msgbox以让用户知道发生了错误,并终止当前过程。唯一不适用的情况是,当您执行某些可能触发错误但却知道并故意绕过错误的情况时。这是一种罕见的情况。

我从未使用过Assert方法,这就是我在每个过程中处理错误的方法

Function generateTimeseries() As Variant

    On Error GoTo ErrorHandler

    Dim currentArray As Range

    currentArray = Selection.Range ' this doesn't work - I don't care why

    generateTimeseries = currentArray.Rows

Exit_Function:
       Exit Function

ErrorHandler:
        MsgBox Err.Description, vbCritical, "Error " & Err.Number
        Resume Exit_Function ' breakpoint here if you want examine the code after error, otherwhise it terminates the function
        Resume ' Once  the code breaks on the above line, move to this instruction and F8 to return to the statement in error

End Function

答案 1 :(得分:0)

我已将该功能启用为"打破所有错误"在较早的尝试中打破所有错误。

我通过转到Tools->Options->General并将Break on All Errors替换为Break on Unhandled Errors来解决此问题。

事实证明Break on All Errors是Windows用于"打破一些错误,但如果它是UDF错误"则返回垃圾。