Решено Обработка ошибок, логгирование, трейсинг и юнит-тестинг

Тема в разделе "Lotus - Программирование", создана пользователем kolka, 18 сен 2016.

  1. kolka

    kolka New Member

    Регистрация:
    16 фев 2013
    Сообщения:
    4
    Симпатии:
    0
    Хочу поделиться библиотеками для обработки ошибок, логгирования, отслеживания выполнения кода и тестирования компонентов (unit testing). Навеяно жавой и обидой отсутствия подобного в LS.
    Код на гитхабе: https://github.com/dev-ng/ls-dl Описание смотрите в README.

    Есть дальнейшие идеи развития, но по времени самостоятельная реализация может сильно затянуться в связи с загрузкой. Если есть желающие - присоединяйтесь!

    В списке идей:
    - отвязать управление логгированием от кода, т.е. переключение в режим debug для выбранного модуля делать без изменения кода (через UI, notes.ini или т.п)
    - сделать логгирование в файл в стандартном формате, понимаемом существующими анализаторами логов
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    напишу сюда...
    Есть код, кот. содержит обработчики, есть класс, в кот. определены действия на Delete...
    в это ф-ции вызывается метод с "пропуском" ошибки
    Код (LotusScript):
    Function IsArrayInitialized(arr) As Boolean
        Dim routineName As String
        routineName="IsArrayInitialized"
        On Error GoTo ErrH
        'your code here
        Dim intTemp As Integer
        On Error GoTo Continue
        intTemp = UBound(arr)
        IsArrayInitialized = True
        If false Then
    Continue:
            Resume Quit
        End If
    Quit:
        Exit Function
    ErrH:
        'Error Err,
        RaiseError
        Resume Quit
    End Function
     
    по понятным причинам, при возникновении ошибки - я получу "не ту" что являлась источником
    т.е. класс дестроится, при ошибке в коде, и в ходе этой процедуры перебивается ошибка вызвавшая процесс
    что можно сделать? - прописать явно номер ошибки в обработчик?
     
  3. kolka

    kolka New Member

    Регистрация:
    16 фев 2013
    Сообщения:
    4
    Симпатии:
    0
    По порядку,
    1. Это лишнее:
    Код (LotusScript):
        Dim routineName As String
        routineName="IsArrayInitialized"
    Заменяется GetThreadInfo( LSI_THREAD_PROC )
    Код (LotusScript):
    GetThreadInfo(1)
    2. Проверку массива на пустоту можно так сделать:
    Код (LotusScript):
    Function isArrayInitialized( arr As Variant ) As Boolean
        isArrayInitialized = False
        On Error GoTo catch
     
        Dim intTemp As Integer
        intTemp = UBound( arr )
        isArrayInitialized = True
     
        GoTo finally
    catch:
        Resume finally
    finally:
    End Function
    И я бы сюда никакой другой функциональности не добавлял.
    3. Если есть необходимость использования подобной функции в обработчике другой ошибки, т.е. основная ошибка была получена ДО вызова проверки массива на инициализацию, то в вызывающем методе в самом начале сохраняются данные об ошибке (Error, Err, Erl), а потом проводится дальнейшая обработка. Пример можно найти в LS DL в classOverloadFactory:
    Код (LotusScript):
    Function classOverloadFactory( argClassName As String ) As Variant
        On Error Resume Next
     
        Dim sError As String
        sError = Error
        Dim iErr As Integer
        iErr = Err
     
        Set classOverloadFactory = Nothing
        If IsElement( gl_overloadClassNames( argClassName ) ) Then
            Set classOverloadFactory = classInstanceFactory( gl_overloadLibraryNames( argClassName ), gl_overloadClassNames( argClassName ) )
            Execute {use "} & gl_overloadLibraryNames( argClassName ) & {"
    Call } & gl_overloadLibraryNames( argClassName ) & {_init()}
        End If
     
        If Not ( Err = iErr And Error = sError ) Then
            If Not ( "" = sError And 0 = iErr ) Then
                Error iErr, sError
            End If
        End If
    End Function
     
    #3 kolka, 23 окт 2016
    Последнее редактирование: 23 окт 2016
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    не заменяется! это поддержка отображения "нужного имени" при изменениях (и внесено в шаблон формирования ф-ций, в ДД)
    оставлено именно для такой фичи
    в обработчике ошибок уже есть GetThread...
    об этом и пост...
    как описал - происходит в деструкторе класса, кот. может быть вызван и при ошибке в коде
    собственно - это попытка сохранить произведенные действия (до ошибки) и иметь более-менее целостное состояние "связанных" документов
    а расстраивает убиение реальной ошибки (в логах-то трейс осядет, но юзеру высветит фигню)
     
    #4 lmike, 25 окт 2016
    Последнее редактирование: 25 окт 2016
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    это все понятно, только хочется иметь это на базе обработчика, т.е. библиотеку обработки ошибок допилить к-л образом...
    свой велик есть (для обработки ошибок, но без указанной фичи), а в тырнетах вменяемого не находил
     
  6. kolka

    kolka New Member

    Регистрация:
    16 фев 2013
    Сообщения:
    4
    Симпатии:
    0
    Я правильно понимаю сценарий?
    Код (LotusScript):
        Dim arr as Variant

        On Error GoTo catch
     
        'основная ошибка где-то тут
     
        GoTo finally
    catch:
        Dim msg As String
        msg = "Array initialized: " & isArrayInitialized( arr ) 'вот тут стек убивается
        throwExceptionDetailed msg
    finally:
    Задачка. Надо подумать. Хотя, решение остается тем же:
    Код (LotusScript):
        Dim arr as Variant

        On Error GoTo catch
     
        'основная ошибка где-то тут
     
        GoTo finally
    catch:
        Dim sError As String
        sError = Error
        Dim iErr As Integer
        iErr = Err
     
        Dim msg As String
        msg = "Array initialized: " & isArrayInitialized( arr ) 'вот тут стек убивается
     
        On Error Resume Next
        If Not ( Err = iErr And Error = sError ) Then
            If Not ( "" = sError And 0 = iErr ) Then
                Error iErr, sError
            End If
        End If
     
        On Error Goto 0
        throwExceptionDetailed msg
    finally:
    Написанное выше не тестировал...
    Вопрос как засунуть в обработчик. Напрашивается внутреннее хванилище для запоминания ошибки. Но тогда потребуется дополнительно метод для сброса запомненной ошибки. Как ни крути неудобно.
    Выходом вижу только расширение с добавлением двух методов:
    Код (LotusScript):
    Sub saveExceptionState()
    Sub throwSavedException( msg As String )
    Вариант?

    Номер строки с ошибкой в некоторых случаях может потеряться. Но тут решения я не вижу.
    Хотя вру, его можно при сохранении запомнить.
     
    #6 kolka, 25 окт 2016
    Последнее редактирование: 25 окт 2016
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    @kolka похожий сценарий...
    беда в "разнесении" кода, будет вопрос - где ставить saveExceptionState()
     
Загрузка...
Похожие Темы - Обработка ошибок логгирование
  1. vladis222
    Ответов:
    1
    Просмотров:
    1.302
  2. Akupaka
    Ответов:
    64
    Просмотров:
    18.107
  3. sanch
    Ответов:
    2
    Просмотров:
    2.711
  4. anna
    Ответов:
    9
    Просмотров:
    881
  5. FaRReLL
    Ответов:
    0
    Просмотров:
    867

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