0

VB6 中将错误传递回调用函数的最佳方法是什么?

1    On Error Resume Next
2    ' do something
3    If Err.Number <> 3026 Or Err <> 0 Then ?????????

您如何将第 3 行中的错误发送回调用函数?以下是实现这一目标的唯一方法吗?

errNum = Err.Number
On Error Goto 0    
Err.Raise errNum
4

4 回答 4

2

在处理程序中使用On Error GoTo并重新引发错误Err.Raise

Private Function DoSomething(ByVal Arg as String)

    On Error GoTo Handler

    Dim ThisVar as String
    Dim ThatVar as Long

    ' Code here to implement DoSomething...

    Exit Function

Handler:
    Err.Raise Err.Number, , "MiscFunctions.DoSomething: " & Err.Description

End Function

然后,您将能够通过Err.Number和获取调用者中的错误号和描述Err.Description

如果调用者也在使用On Error GoTo,您将在那里的处理程序中看到它们。

如果调用者正在使用On Error Resume Next,那么您仍然可以内联使用这些相同的变量。

我更喜欢第一个选项,在所有函数和子程序中使用 On Error Goto,因为这似乎是使用 VB6 内置错误引发功能的自然方式。您还可以像上面的示例一样更新被调用函数的处理程序中的描述,并获得一个伪调用堆栈,您最终可以在调试期间记录或显示给自己。

更多 VB6 错误处理思路:

是否可以在 VB6 中以编程方式检索调用堆栈?

如何清理函数中的错误处理?

于 2013-01-16T13:47:20.613 回答
0

为什么不添加ByRef errorCode as Long到被调用函数的 args 并将其设置为等于 Err.Number 之后' do something

或者你可以有一个名为的公共字段ErrorCode as Long,你可以在之后设置' do something

我使用过很多工业控制 API,并且这两种方法都被使用过。

于 2013-01-15T23:32:55.583 回答
0

如果您只是想将错误传递回原始调用者而不处理它,那么您想删除子函数中的任何 ON ERROR :

Public Sub ParentSub()
    On Error GoTo ErrorHandler
    ' do something
    Call ChildSub()
    ' do something
    Exit Sub
ErrorHandler:
    ' handle the error here
End Sub

Public Sub ChildSub()
    ' do something
    ' if there is an error here, the error will be handled in ErrorHandler of ParentSub
End Sub

或者如果你想在两个潜艇中处理它:

Public Sub ParentSub()
    On Error GoTo ErrorHandler
    ' do something
    Call ChildSub()
    ' do something
    Exit Sub
ErrorHandler:
    ' handle the error here
End Sub

Public Sub ChildSub()
    On Error GoTo ErrorHandler
    ' do something
   Exit Sub
ErrorHandler:
    ' handle the error here and pass it back to the ParentSub to handle it as well
    Err.Raise Err.Number
End Sub
于 2013-01-16T21:52:53.903 回答
0

只要引发错误的函数没有(ON ERROR RESUME ---),您就可以轻松地将错误发送到上层(调用)子/函数,这样,错误处理只留在上层。否则你将不得不处理被调用函数内部的错误

Private Sub Command1_Click()
     Dim test As Integer
     On Error Resume Next
     test = myFunction     'Calling a function that is known to have an error
     If Err <> 0 Then
         MsgBox "MyFunction failed because:" & Err.Description 'Error is passed
     End If

End Sub

'--------------------------    

Function myFunction() As Integer
    Dim i As Integer
    i = 1
    i = 4 / 0   'This will raise an Error, and control returns to the calling sub
    i = 2       'This will never get executed
    myFunction = i
End Function
于 2013-01-16T14:37:06.837 回答