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

Тема в разделе "Lotus - Программирование", создана пользователем allex, 31 авг 2010.

Статус темы:
Закрыта.
  1. allex

    allex Гость

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

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Там вроде всё понятно: номер строки не в перделах функции, а глобально в пределах Declaration там указывается.
     
  3. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    приведи код и ошибку
     
  4. allex

    allex Гость

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

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    У меня тоже ошибки логируются в отдельную БД. В логе помимо Error, Err, Erl указывается БД-источник ошибки и название модуля. Названия модулей прописываю в стандартно названных константах в (Declarations). В обработчиках ошибок методов класса кроме имени функции также логирую имя класса через вызов Typename(Me).
     
  6. allex

    allex Гость

    Код во вьюхе
    Код (LotusScript):
    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
    Класс
    Код (LotusScript):
    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.
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Я так понимаю, проблема в эклипсовом дизайнере? Выбери в меню Navigate->Go to Erl line...
     
  8. allex

    allex Гость

    Да, дизвйнер эклипсовый.
     
  9. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    а разве он не херит деклары на отдельные якобы функции, после чего в декларах вообще ничего не остаётся? :)
     
  10. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Нет. Он хитро отображает. Код ошибки только нельзя искать по общему листингу (какие идиоты это придумали?!), приходится угадывать где ошибка и юзать готуеррлайн.
    Я иногда добавляю в сообщение об ошибке название класса-метода, тогда искать легче.
     
  11. allex

    allex Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    А что думать? Ввел номер строки с ошибкой и перешел туда.
     
  13. allex

    allex Гость

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Что-то не пойму уже, что требуется.
     
  15. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    так может просто с момента появления ошибки уже код изменился?
     
  16. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Актуальность не теряется. Просто нужно не смотреть в код, а выполнить действие Navigate->Go to Erl line...(номер строки).
     
  17. allex

    allex Гость

    Думаю что так и придеься делать.
     
  18. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    allex но надо было 3м человекам в теме сказать одно и то же, чтоб дошло? =)
     
  19. allex

    allex Гость

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

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

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Код (Text):
    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
    Лен, спасибо, давно так не ржал :(
    чисто индусский код ;)
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей