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

  • Автор темы Yakov
  • Дата начала
Y

Yakov

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

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 203
24
38
Киев
ToxaRat.com
#2
я эту задачу решил жестко
пользователю показываю лишь то что произошла ошибка, саму же ошибку запаковываю в базу и агент ночью отправляет её мне
Как показала практика, много данный не нужно, лишь код ошибки, тип и в какой процедуре + возможно ИД документа на котором она произошла и его экспорт
 
#3
У нас примерно так ( за основу была взята статья Andre Guirard http://www.ibm.com/developerworks/lotus/li...LS2/index.html)
Исключения обрабатываюца в обязательном порядке. Каждая ф-ция, процедура, метод класса обычно завершаеца обработчиком( smartButton в дизайнере ):
Код:
 Exit Function
errhandle:
Call errHandler.catch( LIB_NAME & {.} & TypeName(Me) & {.} & GetThreadInfo( 1 ) & {: } & Erl )
Exit Function
LIB_NAME - приватная константа, определяется на уровне элемента дизайна.( библиотека, форма, кнопка на форме ... )
Если исключение может быть отработано внутри функции - оно там и обработается:
Код:
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-ов.