Frage

Wenn ein Fehler in einer Funktion auftritt, würde Ich mag die Abfolge der Ereignisse kennen, die sie führen, vor allem, wenn diese Funktion von einem Dutzend verschiedenen Orten genannt wird. Gibt es eine Möglichkeit den Call-Stack in VB6 abgerufen werden, oder muss ich es auf die harte Art und Weise zu tun haben (zum Beispiel Log-Einträge in jeder Funktion und Fehlerbehandlung, etc.)?

War es hilfreich?

Lösung

Ich bin mir ziemlich sicher, dass Sie es auf die harte Art und Weise zu tun haben. Bei einer früheren Arbeit von mir, wir hatten einen sehr eleganten Fehlerbehandlungsprozess für VB6 mit DCOM-Komponenten. Aber es war eine Menge redundanter Code, der zu jeder Methode werden mußte hinzugefügt, so sehr, dass wir home-grown-Tools einzusetzen alles für Sie hatten.

Ich kann nicht zu viel Einblick über die Umsetzung liefern (beide, weil ich das meiste vergessen und es gibt eine Chance, dass sie es ein Geschäftsgeheimnis betrachten kann). Eine Sache, die war nicht auffallen, dass der Methodenname nicht zur Laufzeit abgeleitet werden könnte, so dass es als String-Variable hinzugefügt wurde (einige Entwickler würden copy-paste stattdessen das Werkzeug zu verwenden, und es wäre zu Fehlerstapel führt, die gelogen. ..).

HTH

Andere Tipps

Sie haben es auf die harte Art und Weise zu tun, aber es ist nicht wirklich alle , die hart ... Im Ernst, wenn Sie die Vorlage einmal geschrieben haben, es ist ein schnelles kopieren / Einfügen / ändert den Namen der Funktion der eigentlichen Funktionsnamen in der Err.Raise Rechnung.

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

Wenn Sie Anrufe verschachtelt haben, diese abwickelt als jede Routine seine Handler trifft und fügt ihren Namen in der Fehlerbeschreibung. Auf der obersten Ebene Funktion, erhalten Sie einen „Call-Stack“ zeigt die Liste der Routinen, die aufgerufen wurden, und die Fehlernummer und eine Beschreibung des Fehlers, der tatsächlich eingetreten ist. Es ist nicht perfekt, dass Sie nicht bekommen, Zeilennummern, aber ich habe festgestellt, dass Sie nicht in der Regel sich Ihren Weg, um das Problem zu finden. (Und wenn Sie wirklich Zeilennummern wollen, können Sie sie in der Funktion setzen und sie in der Err.Raise Anweisung verweisen auf die Erl Variable. Ohne Zeilennummern, die nur 0 zurück.)

Beachten Sie auch, dass in der Funktion selbst, können Sie Ihre eigenen Fehler mit den Werten von interessanten Variablen in der Meldung wie so erhöhen können:

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

(Die Syntaxhervorhebung sieht wackelig in der Vorschau ... Ich frage mich, wie wird es, wenn gebucht aussehen?)

Wie andere Leute schon gesagt (vor Jahren, ich sehe ... aber es gibt so viele Menschen immer noch mit VB6! :)), ich denke, es ist nicht möglich, programmatisch den Call-Stack abzurufen, wenn Sie einige 3rd-Party-Tool verwenden.

Wenn Sie jedoch, dass die Zwecke für die Fehlersuche zu tun, können Sie erwägen, zu dem gerufenen Routine eines optionalen Eingabestring Variable hinzuzufügen, waren Sie den Namen des Anrufers gestellt werden.

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

Nicht so elegant, vielleicht, aber es funktioniert für mich.

Viele Grüße, Max - Italien

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top