如何在VBA中重新抛出错误

9
当出现错误时,我希望进行一些清理操作,然后让错误继续向上流动,以便全局处理。
在C#中,我会使用try finally,但在VBA中不可能,只能使用On Error GoTo 。
当在标签中捕获错误时,如何正确地重新抛出错误?
是否只能调用Err.Raise并使用所有属性再次引发错误,没有类似于throw的关键字存在?
Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext

1
你基本上把它搞定了。不过我个人会省略 Err.HelpFile, Err.HelpContext 这一部分。 - Comintern
Err.Raisethrow 到底有什么不同?你可以把它看作是一个关键字。 - John Coleman
@JohnColeman 因为我不确定这是否是“重新抛出”的正确方式。例如,在C#中,您可以只抛出异常而不创建新的异常实例。 - Kapé
1
@Comintern 为什么我不应该传递 Err.HelpFileErr.HelpContext - Kapé
2个回答

4

这是正确的方法,但不需要重新列出所有错误属性。 值将被保留:

err.raise Err.Number

等同于

Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext

https://learn.microsoft.com/zh-cn/office/vba/Language/Reference/user-interface-help/raise-method

如果你在类模块中进行抛出异常,可能会更加复杂。默认情况下,类模块的错误对象会被捕获并重新创建,因此根据其声明方式,属性可能会被替换。


有没有一种方法可以在不丢失调用堆栈的情况下完成这个操作?这将允许使用“try-finally”模式,同时保留正确调试调用堆栈的能力。 - rudolfbyker
1
@rudolfbyker。没有内置的方法来保留调用堆栈。你可以自己做,或者使用MZtools为你编写代码。 - david

-2
我认为你应该使用ON ERROR GOTO...来处理错误,并在"next_step"中继续错误处理。例如:
Sub test()
    'IF OCCOUR ERROR INSIDE THIS BLOCK THE ERROR CONTINUE IN "next_step"
    On Error GoTo next_step

    If Err.Number = 10 Then
        Msgbox"Error!"
    End If

    next_step:
    'YOU CAN CONTINUE YOUR CODE HERE!!

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接