有时有一个函数会在某些情况下抛出错误,并且您想使用该函数,但在您的特定用例中,导致抛出的情况并不是真正的错误情况。例如,也许有一个函数可以从键值集中删除一个条目,如果集合中没有这样的键,它会抛出错误,如果有则返回删除的值。这在很多情况下都很好,但在某些特定情况下,如果条目存在,您想要删除它,并且您不在乎它是否不存在。
因此,要么你用多条“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 的错误处理程序不会捕获。
有没有办法以相对干净且不太冗长的方式做我想做的事情?