错误处理只工作一次

Posted

技术标签:

【中文标题】错误处理只工作一次【英文标题】:Error handling only works once 【发布时间】:2016-02-12 22:03:23 【问题描述】:

我有一个非常简单的 VBA 代码,它应该尝试打开一个不存在的文件,将我发送到错误处理程序,然后在无限循环中(故意)返回我的代码。

但是,编译器仅在第一次捕获错误,然后在第二次传递时中断。

我已经尝试了 On Error 语句的每种组合,以便在第二次通过时将其发回,但似乎没有任何效果。 代码如下:

Sub TestError()
    On Error GoTo errError
lblError:
    On Error GoTo errError
    'Code that should raise an error and send to errError
    Excel.Application.Workbooks.Open ("lakdfjldkj")
    Exit Sub
errError:
    MsgBox "Code didn't break"
    GoTo lblError
End Sub

是我遗漏了什么,还是这是一个错误?

除非你对不得不杀死 Excel 或添加额外的循环条件感到安心,否则不要测试它

【问题讨论】:

【参考方案1】:

使用Resume 来...好吧...继续在错误处理程序之后处理。

Sub TestError()
    On Error GoTo errError

    'Code that should raise an error and send to errError
    Excel.Application.Workbooks.Open "lakdfjldkj"
    Exit Sub
errError:
    MsgBox "Code didn't break"
    Resume
End Sub

我已经使用这样的代码访问某个工作表,如果找不到,则错误处理程序会创建一个具有正确名称的工作表,然后继续处理。

【讨论】:

这成功了!我保留了标签,我想我必须使用 Resume 而不是 GoTo 才能转到特定行 旧子但评论帮助他人:这几乎对我有用,但我的错误在循环内并重复了错误 ad infitum - Resume Next 解决了这个问题。 【参考方案2】:

您需要使用以下命令清除错误消息:

Err.Clear

来源:https://msdn.microsoft.com/en-us/library/hh2zczch(v=vs.90).aspx

基本上它仍然认为你正在处理错误,并且没有重置处理机制,所以在你清除它之前它不会重新触发。

(Resume 也会清除错误,正如您可以从上面的参考资料中看到的那样)。

【讨论】:

Err.clear 不起作用,但用 Resume 替换 GoTo 似乎可以清除它 在错误处理程序中使用Err.Clear 是不明智的...使用Err.Clear 代替Resume 会导致意外行为。根据您链接到的文档,“Clear 方法在 [之后] 自动调用...任何类型的 Resume 语句。

以上是关于错误处理只工作一次的主要内容,如果未能解决你的问题,请参考以下文章

处理错误“WebDev.WebServer.Exe 已停止工作”

在 nuxt 中出现此错误:[vuex] 不要在突变处理程序之外改变 vuex 存储状态

春季批处理调度期间出现的错误

如何在此代码 Python 中处理 ValueError? [复制]

jQuery 提交事件处理程序只工作一次

期待错误处理 - spawn id未打开