函数吸收VB6中的错误?

函数吸收VB6中的错误?,vb6,error-handling,Vb6,Error Handling,有时有一个函数会在某些情况下抛出错误,您希望使用该函数,但在您的特定用例中,导致抛出的情况实际上不是错误情况。例如,可能有一个函数可以从键值集中删除一个条目,如果集合中没有这样的键值,它会抛出一个错误,如果有,则返回已删除的值。这在很多情况下都很好,但在某些特定情况下,如果某个条目存在,你就想删除它,而你不在乎它是否存在 因此,要么在代码中出现多个错误行: ' General error handling On Error GoTo ErrorHandler ' Do some stuff (

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

因此,要么在代码中出现多个错误行:

' 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)
但这当然不起作用,因为吸收体RorString并不是在调用Delete;相反,主函数正在调用Delete,如果成功,则主函数将调用AbsorbErrorString。因此,Delete抛出的错误会导致完全绕过AbsorbErrorString,因此AbsorbErrorString的错误处理程序不会捕获该错误


有没有一种方法可以像我想要的那样,以一种相对干净且不太冗长的方式执行?

不幸的是,除非像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来提高性能。据我的一些同事说,它还保存了一个不必要的字符串副本。

您可能需要查看一下。我认为你应该能够使用它来实现你的幻想状态。Daniel Cook,谢谢,但这只有在所需的底层函数是对象的成员时才有效,对吗?没错。下面是关于可能的替代方案的讨论。有多少函数属于这一类?