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

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

allex

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

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

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#2
Там вроде всё понятно: номер строки не в перделах функции, а глобально в пределах Declaration там указывается.
 
A

allex

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

nvyush

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

allex

Гость
#6
Код во вьюхе
Код:
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

Что это ? :)
Lotus team
10.12.2004
3 346
2
#7
Я так понимаю, проблема в эклипсовом дизайнере? Выбери в меню Navigate->Go to Erl line...
 

Akupaka

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

allex

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

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#12
А что думать? Ввел номер строки с ошибкой и перешел туда.
 
A

allex

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

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

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#16
В том то и дето что думать надо(когда ошибка в процедуре класса)
В отдельной базе создается док-т с ошибкой, в котором написано, что в процедуре такой-то в строке такой-то есть шибка такая-то, а реально в код смотришь и видешь, что это строка например %rem

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

hosm

* so what *
18.05.2009
2 442
9
#18
allex но надо было 3м человекам в теме сказать одно и то же, чтоб дошло? =)
 
A

allex

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

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

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 224
24
#20
Код:
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
Лен, спасибо, давно так не ржал :(
чисто индусский код ;)
 
Статус
Закрыто для дальнейших ответов.