1

有时有一个函数会在某些情况下抛出错误,并且您想使用该函数,但在您的特定用例中,导致抛出的情况并不是真正的错误情况。例如,也许有一个函数可以从键值集中删除一个条目,如果集合中没有这样的键,它会抛出错误,如果有则返回删除的值。这在很多情况下都很好,但在某些特定情况下,如果条目存在,您想要删除它,并且您不在乎它是否不存在。

因此,要么你用多条“On Error”行乱扔代码:

' General error handling
On Error GoTo ErrorHandler

' Do some stuff
(...)

' Don't throw an error just because the key doesn't have an entry
On Error Resume Next

' Delete it if it's there
DeletedValue = Delete(Key)

' Go back to regular error handling
On Error GoTo ErrorHandler

' Do some more stuff
(...)

或者你写一个小包装函数:

Public Function DeleteButDoNotThrowError(ByVal Key As String) As String
    On Error GoTo ErrorHandler

    DeleteButDoNotThrowError = Delete(Key)

    Exit Function

ErrorHandler:
    DeleteButDoNotThrowError = vbNullString
End Function

我讨厌第一种方式——它对我来说似乎太冗长了——所以我通常使用第二种方式。但我真正想要的是不必每次我想以这种方式使用函数时一遍又一遍地编写这样的包装器。所以我想要类似的东西:

Public Function AbsorbErrorString(ByVal CallReturn As String, _
        ByVal ErrorReturn As String) As String
    On Error GoTo ErrorHandler

    AbsorbErrorString = CallReturn

    Exit Function

ErrHandler:
    AbsorbErrorString = ErrorReturn
End Function

然后您将(在我的幻想世界中)能够像这样使用它:

DeletedValue = AbsorbErrorString(Delete(Key), vbNullString)

但这当然行不通,因为 AbsorbErrorString 调用 Delete 的情况并非如此;相反,主函数正在调用 Delete,如果成功,则只有在那时主函数才会调用 AbsorbErrorString。所以 Delete 抛出的错误会导致 AbsorbErrorString 被完全绕过,因此 AbsorbErrorString 的错误处理程序不会捕获。

有没有办法以相对干净且不太冗长的方式做我想做的事情?

4

1 回答 1

0

不幸的是,这是不可能的,除非将代码作为字符串传递(正如 Daniel Cook 提到的那样)。

我所能建议的只是对您的第二个示例进行较小的调整,以减少样板代码。它并不多,但它与 VB6 中的性能差不多。

Public Function SafeDelete(ByRef Key As String) As String
    On Error GoTo ErrorHandler
    SafeDelete = Delete(Key)
ErrorHandler:
End Function

如果Delete引发错误,SafeDelete 仍将保留其旧值,默认为空字符串。然后可以通过(现在为空的)错误处理程序。此外,您将希望使用 ByRef 而不是 ByVal 来提高性能,以防包装函数需要 ByRef。(据我的一些同事说,它还保存了不必要的字符串副本。)

于 2013-01-12T07:10:44.927 回答