14

関数でエラーが発生した場合、特にその関数が12の異なる場所から呼び出された場合に、それに至る一連のイベントを知りたいです。VB6でコールスタックを取得する方法はありますか、それとも難しい方法で取得する必要がありますか(たとえば、すべての関数やエラーハンドラーのエントリをログに記録するなど)?

4

5 に答える 5

14

難しい方法で行う必要がありますが、それほど難しいことではありません...真剣に、テンプレートを一度作成すると、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

ネストされた呼び出しがある場合、各ルーチンがハンドラーにヒットし、その名前がエラーの説明に追加されると、これが巻き戻されます。最上位の関数では、呼び出されたルーチンのリスト、エラー番号、および実際に発生したエラーの説明を示す「呼び出しスタック」を取得します。行番号がわからないという点で完璧ではありませんが、問題への道を見つけるために通常は行番号は必要ないことがわかりました。(そして、本当に行番号が必要な場合は、それらを関数に入れて、Erl変数を使用してErr.Raiseステートメントで参照できます。行番号がないと、0が返されます。)

また、関数自体の中で、次のようにメッセージ内の興味深い変数の値を使用して独自のエラーを発生させることができることに注意してください。

Err.Raise PCLOADLETTER_ERRNUM, , "PC Load Letter error on Printer """ & PrinterName & """"

(プレビューでは構文の強調表示が不安定に見えます...投稿するとどのように表示されるのでしょうか?)

于 2008-10-15T22:13:41.503 に答える
9

私はあなたがそれを難し​​い方法でやらなければならないと確信しています。私の以前の仕事では、DCOM コンポーネントを使用した VB6 の非常に洗練されたエラー処理プロセスがありました。ただし、すべてのメソッドに追加しなければならない冗長なコードが多かったため、すべてを挿入する独自のツールが用意されていました。

私はその実装についてあまり多くの洞察を提供することはできません (私はそのほとんどを忘れており、彼らがそれを企業秘密と見なす可能性があるため)。際立っていることの 1 つは、実行時にメソッド名を派生させることができなかったため、文字列変数として追加されたことです (一部の開発者は、ツールを使用する代わりにコピー アンド ペーストを行い、嘘をついたエラー スタックにつながります。 ..)。

HTH

于 2008-09-24T15:13:31.497 に答える
2

難しい手動の方法がほとんど唯一の方法です。この質問を確認すると、面倒な作業の多くを行う MZTools というツールが提案されました。

于 2008-09-24T16:43:52.917 に答える
0

他の人が言ったように (何年も前のことですが、VB6 を使用している人はまだたくさんいます! :))、サードパーティのツールを使用しない限り、プログラムでコール スタックを取得することはできないと思います。

しかし、デバッグ目的でそれを行う必要がある場合は、呼び出されたルーチンにオプションの入力文字列変数を追加することを検討できます。呼び出し元の名前を入力します。

Sub MyRoutine
    (...)  ' Your code here
    call DoSomething (Var1, Var2, Var3, "MyRoutine")
    '                                       ^
    '     Present routine's name -----------+

    (...)  ' Your code here

End Sub


Public DoSomething (DoVar1, DoVar2, DoVar3, Optional Caller as string = "[unknown]")
    Debug.Print " DoSomething Routine Called. Caller = " & Caller

    ... ' (your code here)

End Sub

それほどエレガントではないかもしれませんが、私にとってはうまくいきました。

よろしく、マックス - イタリア

于 2013-11-25T10:59:18.770 に答える
-1

Compuware (当時は Numega でした) DevStudio for Visual Basic 6 がこれを行っていました。その方法は、コード スタックに追加される非常に小さなスニペットを呼び出すすべての呼び出しに追加のインストルメンテーションを追加することでした。エラーが発生すると、そのコールスタックをダンプし、すべてのデバッグ情報をメールや Web サーバーに投稿するなどの処理を行いました。インストルメンテーションの追加と削除は潜在的に致命的な操作でした (特に当時、ソース管理として VSS を使用していたとき) が、それが機能する場合はうまく機能します。

Darrel が指摘したように、MZTools を使用してテンプレートを設定することで、非常に類似したものを追加できます。これは大変な作業であり、おそらく見返りよりも労力がかかりますが、バグを追跡するのが非常に難しい場合は、役立つかもしれません)。

于 2008-10-12T22:18:22.307 に答える