函数吸收VB6中的错误?

时间:2012-12-13 20:11:42

标签: vb6 error-handling

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

因此,如果您使用多个“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的情况;相反,main函数调用Delete,如果成功,那么主函数才会调用AbsorbErrorString。因此,Delete抛出的错误会导致AbsorbErrorString被完全绕过,因此不会被AbsorbErrorString的错误处理程序捕获。

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

1 个答案:

答案 0 :(得分: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,您将需要使用ByRef而不是ByVal来提高性能。 (根据我的一些同事的说法,它还可以保存不必要的字符串副本。)