• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Номер строки ошибки при работе с классами

  • Автор темы allex
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

allex

Есть обработчик ошибок, который пишет необходимую инфу о произошедшей ошибки при работе процедуры/функции, в том числе пишется номер строки.
Все замечательно пока не используем классы. При этом номер строки указывает на мне не понятное место в коде.

Как быть и что делать?
 
O

Omh

Там вроде всё понятно: номер строки не в перделах функции, а глобально в пределах Declaration там указывается.
 
A

allex

Это я понял, но актуальность указания номера строки уже теряется.
Это не лечится ?
Ибо непонятно куда потом смотреть. У меня ошибки логируются в отдельную БД, как потом правильно определить номер строки в указанной процедуре/функции бибилиотеки.
 
N

nvyush

Ибо непонятно куда потом смотреть. У меня ошибки логируются в отдельную БД, как потом правильно определить номер строки в указанной процедуре/функции бибилиотеки.
У меня тоже ошибки логируются в отдельную БД. В логе помимо Error, Err, Erl указывается БД-источник ошибки и название модуля. Названия модулей прописываю в стандартно названных константах в (Declarations). В обработчиках ошибок методов класса кроме имени функции также логирую имя класса через вызов Typename(Me).
 
A

allex

приведи код и ошибку
Код во вьюхе
Код:
On Error Goto errmes
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim strErrMessage
Dim cur_doc_coll As NotesDocumentCollection
Dim cur_doc As NotesDocument
Set cur_doc_coll = db.UnprocessedDocuments
If cur_doc_coll.Count > 0 Then
If cur_doc_coll.Count < 2 Then
Set cur_doc = cur_doc_coll.GetFirstDocument			
End If
End If
Dim spo As New spo
Stop
Call spo.get_docs_charakteristik_kotelnaya(db, cur_doc, "8")
GoOut:
Exit Sub
errmes:
strErrMessage = "Ошибка #" & Err &" <"& Error$ & "> в выполняемой процедуре #" & Getthreadinfo(10) &" подпроцедура #" & Getthreadinfo(1) & ", в строке #" & Cstr(Erl)
Print strErrMessage
Call errorstr(strErrMessage)	
Resume GoOut

Класс
Код:
Class spo
Public Function get_docs_charakteristik_kotelnaya(db As NotesDatabase, cur_doc As NotesDocument, kv As String) As NotesDocumentCollection
On Error GoTo errmes
'чего то делаем .... и получаем
Set get_docs_charakteristik_kotelnaya = coll

GoOut:
Exit Function
errmes:
strErrMessage = "Ошибка #" & Err &" <"& Error$ & "> в выполняемой процедуре #" & GetThreadInfo(10) &" подпроцедура #" & GetThreadInfo(1) & ", в строке #" & CStr(Erl)
Print strErrMessage
Call errorstr(strErrMessage)	
Resume GoOut
End Function
Public Function select_doc_in_docscharakteristiks(coll As NotesDocumentCollection,manual_select_doc As Boolean) As NotesDocument
On Error GoTo errmes
'делаем много проверок... выбрали... получили

Set select_doc_in_docscharakteristiks = db.Getdocumentbyunid(coll.Getlastdocument.Universalid)

GoOut:
Exit Function
errmes:
strErrMessage_rep = "Ошибка #" & Err &" <"& Error$ & "> в выполняемой процедуре #" & GetThreadInfo(10) &" подпроцедура #" & GetThreadInfo(1) & ", в строке #" & CStr(Erl)
Print strErrMessage_rep 
Call errorstr(strErrMessage_rep)	
Resume GoOut
End Function
Public Function getmaindoc_ofresponce(doc As NotesDocument) As NotesDocument
On Error GoTo errmes
исчем ... и получаем это 
Set getmaindoc_ofresponce = db.Getdocumentbyunid(doc.ID(0))	
'или это	Set getmaindoc_ofresponce = Nothing
GoOut:
Exit Function
errmes:
strErrMessage_rep = "Ошибка #" & Err &" <"& Error$ & "> в выполняемой процедуре #" & GetThreadInfo(10) &" подпроцедура #" & GetThreadInfo(1) & ", в строке #" & CStr(Erl)
Print strErrMessage 
Call errorstr(strErrMessage)	
Resume GoOut
End Function
End Class
Ошибка предположим возникла на участке функции get_docs_charakteristik_kotelnaya в строке 15
а обработчик пишет что Erl=37, открываем код и ищем 37 строку и попадаем например на строку Print strErrMessage.
Понятно что там ошибки быть не может, но следуя тому что написано. человек будет искать именно ту строку которая написана, а именно 37.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Я так понимаю, проблема в эклипсовом дизайнере? Выбери в меню Navigate->Go to Erl line...
 
A

Akupaka

а разве он не херит деклары на отдельные якобы функции, после чего в декларах вообще ничего не остаётся?
Нет. Он хитро отображает. Код ошибки только нельзя искать по общему листингу (какие идиоты это придумали?!), приходится угадывать где ошибка и юзать готуеррлайн.
Я иногда добавляю в сообщение об ошибке название класса-метода, тогда искать легче.
 
A

allex

Я пишу так, тип ошибки, ее номер кто(функция/процедура) инициировал вызов и непосредственно что (функция/процедура) инициировали.
Но получается то как я описывал выше, по этому номеру можно впороться в принт или REM ... вот и думай потом
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
А что думать? Ввел номер строки с ошибкой и перешел туда.
 
A

allex

А что думать? Ввел номер строки с ошибкой и перешел туда.
В том то и дето что думать надо(когда ошибка в процедуре класса)
В отдельной базе создается док-т с ошибкой, в котором написано, что в процедуре такой-то в строке такой-то есть шибка такая-то, а реально в код смотришь и видешь, что это строка например %rem

Актуальность такого указателя теряется.
 
N

nvyush

В том то и дето что думать надо(когда ошибка в процедуре класса)
В отдельной базе создается док-т с ошибкой, в котором написано, что в процедуре такой-то в строке такой-то есть шибка такая-то, а реально в код смотришь и видешь, что это строка например %rem

Актуальность такого указателя теряется.
Актуальность не теряется. Просто нужно не смотреть в код, а выполнить действие Navigate->Go to Erl line...(номер строки).
 
H

hosm

allex но надо было 3м человекам в теме сказать одно и то же, чтоб дошло? =)
 
A

allex

А этим 3 -им надо было повторять одно и то же... раз других вариантов нет, чего тогда свой счетчик сообщений накручивать.

Я вообще-то ждал от уважаемой публики ответа как побороть это, а не использовать костыли IBM.
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
Код:
Set cur_doc_coll = db.UnprocessedDocuments
If cur_doc_coll.Count > 0 Then
If cur_doc_coll.Count < 2 Then
Set cur_doc = cur_doc_coll.GetFirstDocument			
End If
End If
Лен, спасибо, давно так не ржал :(
чисто индусский код ;)
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!