Обработка исключений

Тема в разделе "Lotus - Программирование", создана пользователем Yakov, 3 авг 2009.

  1. Yakov

    Yakov Гость

    Привожу в порядок обработку исключений. Поэтому очень интересно узнать, как эту задачу решили вы, уважаемые разработчики.
    Куда записываете трассу стека вызовов - в сообщение об ошибке или в спец. стуктуру?
    Куда и как записываете дополнительную информацию об исключении?
    Что показываете пользователю - краткое сообщение или полную трассу стека?
    Дублируете ли сообщение об ошибке на почту разработчику/администратору (или еще куда)?
    Вообще, насколько широко используете исключения? Генерируете свои или только перехватываете "системные"? "Оборачиваете" ли низкоуровневые "системные" исключения в высокоуровневые исключения бизнес-логики?
    Заранее спасибо за ответы и обсуждение.
     
  2. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    я эту задачу решил жестко
    пользователю показываю лишь то что произошла ошибка, саму же ошибку запаковываю в базу и агент ночью отправляет её мне
    Как показала практика, много данный не нужно, лишь код ошибки, тип и в какой процедуре + возможно ИД документа на котором она произошла и его экспорт
     
  3. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    У нас примерно так ( за основу была взята статья Andre Guirard http://www.ibm.com/developerworks/lotus/li...LS2/index.html)
    Исключения обрабатываюца в обязательном порядке. Каждая ф-ция, процедура, метод класса обычно завершаеца обработчиком( smartButton в дизайнере ):
    Код (Text):
     Exit Function
    errhandle:
    Call errHandler.catch( LIB_NAME & {.} & TypeName(Me) & {.} & GetThreadInfo( 1 ) & {: } & Erl )
    Exit Function
    LIB_NAME - приватная константа, определяется на уровне элемента дизайна.( библиотека, форма, кнопка на форме ... )
    Если исключение может быть отработано внутри функции - оно там и обработается:
    Код (Text):
    on error goto errhandle
    ....
    Set doc = session.CurrentDatabase.getDocumentByUNID( unid$ )
    ' Далее по контексту:
    ' может быть так: (ситуация - ошибка )
    ASSERT not doc is nothing , {Здесь понятное пользователю объяснение произошедшего....} '
    ' или так:( ситуаци - не ошибка )
    if doc is nothing then
    Call doSomethingThenDocIsNothing
    else
    Call doSomethingThenNotDocIsNothing
    end if
    ....
    Exit Function
    errhandle:
    if err = 4091 then resume next ' Местный обработчик
    Call errHandler.catch( LIB_NAME & {.} & TypeName(Me) & {.} & GetThreadInfo( 1 ) & {: } & Erl )
    Exit Function
    Объект errHandler - глобальный( а-ля синглтон - объявлен и инициализирован в библиотеке). Метод catch отдает ошибку вверх по стеку, на предпоследнем уровне выкидывает сообщение об ошибке.( если доступен UI ). Пользователю кажем краткое сообщение + в схлопнутой секции стектрейс и доп. инфа( юзер, бд , версия клиента + юниды и пр. - зависит от контекста ).
    Свои исключения генерятся либо с кодом ERR_NUMBER (1001) либо с кодом WARN_NUMBER( 1002 ) - во втором случае на продакшене сообщение об ошибке не выводится. В зависимоти от настроек - ошибки могут дублироваться в указанную базу, для последующего анализа. Мылить или нет - тоже опция. ( Опции в соответсвующем профиле базы )
    Ошибки в серверных агентах ловяца так же как и на клиенте, судьба сообщения зависит от настроек - лог сервера, самописный лог, почта, файл ( юзается самописное расширенние NotesLog ).
    Собственные исключения в основном генерятся при помощи ASSERT-ов.
     
Загрузка...

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