gpt4 book ai didi

vb6 - 吸收VB6中的错误的功能?

转载 作者:行者123 更新时间:2023-12-03 08:01:02 25 4
gpt4 key购买 nike

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

因此,要么乱扔代码,要么用多行“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的错误处理程序捕获。

有没有一种方法可以以相对干净且不太冗长的方式来完成我想要的事情?

最佳答案

不幸的是,除了传递代码以字符串形式执行之外,这是不可能的(如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来提高性能。 (据我的一些同事称,它还节省了不必要的字符串副本。)

关于vb6 - 吸收VB6中的错误的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13867683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com