Ist es möglich, den Call-Stack programmatisch in VB6 abzurufen?
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.)?
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?)
Die harte, manuelle Art und Weise ist so ziemlich der einzige Weg. Wenn Sie Frage href="https://stackoverflow.com/questions/116289/what-is-the-better-way-to-handle-errors-in-vb6"> auszuchecken, jemand ein Tool namens MZTools vorgeschlagen, die für Sie viel von der Routinearbeit tun.
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
Compuware (oder war es Numega zu der Zeit) DevStudio für Visual Basic 6 verwendet, dies zu tun. Der Weg war durch Zugabe Zugabe Instrumentation zu jedem Anruf, der eine sehr kleine Schnipsel genannt, die mit dem Code-Stack hinzugefügt. Auf jeden Fehler abgeladen es die Aufrufliste aus, und dann tat Dinge wie E-Mail oder Post an einen Webserver alle debug Informationen. Hinzufügen und Entfernen der Instrumentierung wurde eine potenziell tödliche Operation (vor allem damals, als wir VSS als unsere Quellcodeverwaltung bewertet wurden), aber wenn es funktioniert, es funktioniert gut.
Wie Darrel wies darauf hin, , könnten Sie etwas sehr simlar unter Verwendung MZTools und die Einrichtung eine Vorlage hinzufügen. Es ist eine Menge Arbeit, und ist wahrscheinlich effeort als der Lohn sein würde, aber wenn Sie sehr schwer haben Fehler aufzuspüren, es könnte helfen).