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

エラーを処理せずに元の呼び出し元に戻すだけの場合は、子関数の 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 に答える
0

ByRef errorCode as Long呼び出された関数の引数に追加して、後で Err.Number に等しく設定しないのはなぜですか' do something

ErrorCode as Longまたは、後で設定できるというパブリックフィールドを持つこともできます' do something

私は多くの産業用制御 API を使用してきましたが、これらの方法は両方とも使用されています。

于 2013-01-15T23:32:55.583 に答える