我的表单允许用户通过各种控件进行筛选,包括字符串搜索框。一个单独的函数CalculateSearchString处理此搜索字段以筛选(关键字、确切短语等);在此函数中,我使用错误处理来捕获由不正确的用户输入引起的错误(即混淆标点符号)。错误处理工作正常,但是如果搜索输入不正确,我希望代码能够完全停止。
我想要的:
filter
CalculateSearchFilter抛出错误。消息框:“修复您的搜索条件!”筛选器。
实际发生了什么:
filter
CalculateSearchFilter抛出错误。消息框:“修复搜索条件!”Exit functioncmdFilterOn仍然运行,应用了一个不完整的筛选器(好像搜索框是空的)。
问题:如何完全停止代码执行,不仅在函数中,而且在其调用过程中?函数在多个地方使用,因此将其与调用过程合并是不实际的。
Private Sub cmdFilterOn()
Dim strSearch As String
strSearch = CalculateSearchFilter
'do more stuff
End Sub
Private Function CalculateSearchFilter() As String
On Error GoTo ErrHandler
'do stuff
If 'user input is wrong, then raise a custom error:
Err.Raise 50000
End If
ExitHandler:
Exit Function
ErrHandler:
If Err.Number = 50000 Then msgbox "Fix your search terms!"
Resume ExitHandler
End Sub
Private Sub cmdYetAnotherButton()
'which also calls on CalculateSearchFilter
End Sub将输入验证移至调用过程也是不实际的,因为这将迫使我重复CalculateSearchFilter()中的大部分代码。
(在我编写这篇文章时,我想到了另一个解决方案,即在函数错误处理程序和调用过程中设置CalculateSearchFilter = "an error occurred"。
If CalculateSearchFilter = "an error occurred" Then Exit Sub
...but还有更多的“官方”答案吗?)
发布于 2022-03-13 16:13:09
您可以尝试返回一个布尔值。
Option Explicit
Private Sub cmdFilterOn()
Dim strSearch As String
If CalculateSearchFilter(strSearch) Then
'do more stuff
End If
End Sub
Private Function CalculateSearchFilter(ByRef strSearch As String) As Boolean
On Error GoTo ErrHandler
'do stuff
If 'user input is wrong, then raise a custom error:
Err.Raise 50000
End If
CalculateSearchFilter = True
ExitHandler:
Exit Function
ErrHandler:
If Err.Number = 50000 Then MsgBox "Fix your search terms!"
CalculateSearchFilter = False
Resume ExitHandler
End Function
Private Sub cmdYetAnotherButton()
'which also calls on CalculateSearchFilter
End SubAlternative:正如注释中提到的,如果您想要得到一个字符串,那么我将返回一个空字符串。我不建议返回字符串,就像出现错误或其他任何情况一样。
Option Explicit
Private Sub cmdFilterOn()
Dim strSearch As String
strSearch = CalculateSearchFilter
If Len(strSearch) > 0 Then
'do more stuff
End If
End Sub
Private Function CalculateSearchFilter() As String
On Error GoTo ErrHandler
'do stuff
If 'user input is wrong, then raise a custom error:
Err.Raise 50000
End If
ExitHandler:
Exit Function
ErrHandler:
If Err.Number = 50000 Then MsgBox "Fix your search terms!"
CalculateSearchFilter = vbNullString
Resume ExitHandler
End Function
Private Sub cmdYetAnotherButton()
'which also calls on CalculateSearchFilter
End Subhttps://stackoverflow.com/questions/71458250
复制相似问题