Когда в функции возникает ошибка, я хотел бы знать последовательность событий, которые приводят к ней, особенно когда эта функция вызывается из десятка разных мест. Есть ли способ получить стек вызовов в VB6, или мне нужно сделать это жестким способом (например, записи журнала в каждой функции и обработчик ошибок и т.д.)?
Можно ли программным способом получить стек вызовов в VB6?
Ответ 1
Я уверен, что вы должны сделать это с трудом. На предыдущей моей работе у нас был очень элегантный процесс обработки ошибок для VB6 с компонентами DCOM. Тем не менее, это был много избыточный код, который должен был быть добавлен к каждому методу, настолько, что у нас были домашние инструменты, чтобы вставить все это для вас.
Я не могу представить слишком много информации о его реализации (как из-за того, что я забыл большую часть этого, и есть шанс, что они могут считать это коммерческой тайной). Одна вещь, которая выделяется, заключалась в том, что имя метода не могло быть выведено во время выполнения, поэтому оно было добавлено как строковая переменная (некоторые разработчики копировали-вставляли вместо использования этого инструмента, и это приводило бы к стекам ошибок, которые лгали...).
НТН
Ответ 2
Вам нужно сделать это нелегко, но это не все , что сложно... Серьезно, как только вы написали шаблон один раз, он быстро скопирует/вставляет/изменяет сопоставьте имя функции в выражении 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.Raise, используя переменную Erl. Без номеров строк, которые просто возвращают 0.)
Также обратите внимание, что внутри самой функции вы можете поднять свои собственные ошибки со значениями интересных переменных в сообщении следующим образом:
Err.Raise PCLOADLETTER_ERRNUM, , "PC Load Letter error on Printer """ & PrinterName & """"
(подсветка синтаксиса выглядит в предварительном просмотре... Интересно, как это будет выглядеть при публикации?)
Ответ 3
Трудный, ручной способ - это почти единственный способ. Если вы посмотрите этот вопрос, кто-то предложил инструмент под названием MZTools, который сделает для вас большую часть работы.
Ответ 4
Как говорили другие люди (много лет назад, я вижу... но там так много людей все еще используют VB6!:)), я думаю, что невозможно программно получить стек вызовов, если вы не используете какой-либо сторонний инструмент.
Но если вам нужно сделать это для целей отладки, вы можете рассмотреть вопрос о добавлении к вызванной подпрограмме необязательной входной строковой переменной, были ли вы помещены имя вызывающего абонента.
Sub MyRoutine
(...) ' Your code here
call DoSomething (Var1, Var2, Var3, "MyRoutine")
' ^
' Present routine 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
Не так элегантно, может быть, но это сработало для меня.
С уважением, Макс - Италия
Ответ 5
Compuware (или в то время он был Numega), для этого использовался DevStudio для Visual Basic 6. Путь был добавлением добавления инструментария к каждому вызову, который назывался очень маленьким фрагментом, который добавлен в стек кода. По любой ошибке он выгрузил этот столбец, а затем сделал такие вещи, как почта или сообщение на веб-сервере, всю информацию об отладке. Добавление и удаление инструментария было потенциально смертельной операцией (особенно тогда, когда мы использовали VSS в качестве нашего исходного элемента управления), но если это сработало, оно работает хорошо.
Как Даррел указал, вы можете добавить что-то очень simlar с помощью MZTools и настройки шаблона. Это много работает и, вероятно, будет более эффектным, чем награда, но если вам очень сложно отследить ошибки, это может помочь).