Отработать Onerror глобально, обработка ошибок

  • Автор темы allex
  • Дата начала
A

allex

Что бы не писать в множествах "Действия", "Агенты", "Процедуры и функции"
<!--shcode--><pre><code class='vb script'>OnError goto lable

lable:
print Error$ & Chr$(10) & " in procedure " & Getthreadinfo(1) & ", line " & Cstr(Erl)
exit sub[/CODE]

Можно ли как-то глобально определить OnError
 
N

nvyush

Что бы не писать в множествах "Действия", "Агенты", "Процедуры и функции"
<!--shcode--><pre><code class='vb script'>OnError goto lable

lable:
print Error$ & Chr$(10) & " in procedure " & Getthreadinfo(1) & ", line " & Cstr(Erl)
exit sub[/CODE]

Можно ли как-то глобально определить OnError

На 99.99% уверен, что нет. А вместо
Код:
print Error$ & Chr$(10) & " in procedure " & Getthreadinfo(1) & ", line " & Cstr(Erl)
обычно использую конструкцию вида
Код:
Error Err, Error + Chr(10) + "имя модуля" + Getthreadinfo(1) + " строка: " + Cstr(Erl)
Возвращает "путь" к ошибке.
 
A

allex

Как вариант - спасаться шаблонами (в 8.5.1) при создании процедур
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Создать библу с обработчиком. Можно с очень извращённым :welcome: Вызывать из любых мест))
Соединить это с функциалналом записи ошибок в лог. Этого будет выше крыши.
Дополнительно, для облегчения себе дальнейшей жизни, использовать Lsi_info(12) и Lsi_info(14).
 
O

Omh

Как я понимаю, про вид обработчика тут речь не идёт, просто allex'у не охота в начале каждой процедуры писать
Код:
On Error Goto Errh
, а в конце обработчик.
Но, к сожалению, такова наша лотусная судьбинушка :welcome:
 
A

amigolinx

Как вариант - смартбаттоны в дизайнере. На форуме пробегала одна link removed, по ее примеру можно наворотить уйму конструкций
 
N

nvyush

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Пример обработки получения документа по униду</div></div><div class="sp-body"><div class="sp-content">
Код:
Function BadDocToNothing( doc as NotesDocument) as NotesDocument
'Конвертит doc в Nothing если он "кривой"
'Функция никогда не бросает эксепшен
On Error Goto ErrH
if False then
ErrH: Resume ErrQ
ErrQ: Exit Function
End if

if not doc.IsValid or not .IsDeleted then exit function
dim v
v = doc.AnyItem(0) ' обращение к любому полю. Кажется, Hasitem не всегда защищало. Нужно именно получение значения.

'опционально
'if doc.HasItem("$Conflict") or doc.ParentDocumentUNID = doc.UniversalId then exit function

Set BadDocToNothing = doc
End Function

Function GetDocByUNID(db as NotesDatabase, unid$) as NotesDocument
'Получение документа по UniversalId.
'Функция никогда не бросает эксепшен.
On Error Goto ErrH
if False then
ErrH: Resume ErrQ
ErrQ: Exit Function
End if

dim doc as NotesDocument
On Error Resume Next
Set doc = db.GetDocumentByUNID( unid )
On Error Goto ErrH
Err = 0

Set GetDocByUNID = BadDocToNothing( doc )
End Function
TIA
Конструкция вида "if False then" меня повергла в шок :). Потом сообразил, что это. КМК, лишний if не способствует производительности.
Обычно оформляю обработку ошибок так:
Код:
Sub SomeSub()
On Error Goto ErrHandler
...
ExitSub:
Exit Sub
ErrHandler:
MsgBox "Error " & Err & " (" & Error & ") in line " & Erl
Resume ExitSub
End Sub
или так (для трассировки):
Код:
Sub SomeSub()
On Error Goto ErrHandler
...
Exit Sub
ErrHandler:
Error & Chr(10) & "in " & Getthreadinfo(LSI_THREAD_PROC) & " line " & Cstr(Erl)
End Sub
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
nvy
+1

Только я не люблю Getthreadinfo, т.к. надо ещё тянуть файл констант... IMHO, лучше LSI_info.
 
N

nvyush

Только я не люблю Getthreadinfo, т.к. надо ещё тянуть файл констант... IMHO, лучше LSI_info.
Пользую Getthreadinfo, т.к. LSI_info — функция недокументированная.
Файл констант можно не тянуть, а посмотреть значения в справке по Getthreadinfo. Однако с константами, кмк, читабельней.
 
T

TIA

Конструкция вида "if False then" меня повергла в шок
:) Это ожидаемо. Мне самому не приятно. И необходимость использовать Goto меня тоже раздражает. Но это осознанный выбор из других альтернатив.

В моём предыдущем примере обработчик без проброса эксепшена. С пробросом, как у вас, будет выглядеть как-то так:
Код:
On Error Goto ErrH
If False Then
ErrH: Error Err, Error$ & Chr(10) & Getthreadinfo(1) & " (" & Erl & ")"
End If

Ну или если совсем не нравится "If False":
Код:
On Error Goto ErrH
Err=0
ErrH: If Err then Error Err, Error$ & Chr(10) & Getthreadinfo(1) & " (" & Erl & ")"

Когда пишешь новые функции или методы, возникает необходимость вставлять обработчики ошибок. Обычно, это делается копипастом. Попробуй вставить свой и мой обработчик в десяток функций. Мой переносится одним копипастом, вместо двух. Потому что всё сосредоточено в одном непрерывном блоке кода. Не знаю как в вашем случая, а я ради такой возможности готов мириться с 0,000078 сек. задержкой на каждую функцию.

Замечу ещё, что мой обработчик не требует вставки "Exit Sub". А в вашем случае после копипаста приходится ещё менять "Exit Function" на "Exit Sub", угадал? Ди и время, которое добавляет интерпретация "Exit Sub" сопоставима с временем выполнения "if false"

Впрочем, это вопрос вкуса и повод для священных войн -- я пас. Не нравится -- не ешьте. :)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Пользую Getthreadinfo, т.к. LSI_info — функция недокументированная.
Getthreadinfo тоже была когда-то недокументируемой :)
А то, что LSI_info в хэлпе недокументируема, так это не страшно; хотя указание в keywords на неё всё же есть, да и в Designer'е она подсвечивается как надо)) Доказательство её будущего использования то, что однажды в неё добавили возможность анализа памяти; если бы хотели забить, то не добавляли бы.
+ LSI_info, что у неё гораздо больше возможностей (Getthreadinfo по сравнению выглядит атавизмом )) ), да и короче она в написании :)

Когда пишешь новые функции или методы, возникает необходимость вставлять обработчики ошибок. Обычно, это делается копипастом.
В новом Designer'е есть шаблоны для функций и процедур, куда это один раз добавляется...
 
N

nvyush

Когда пишешь новые функции или методы, возникает необходимость вставлять обработчики ошибок. Обычно, это делается копипастом. Попробуй вставить свой и мой обработчик в десяток функций. Мой переносится одним копипастом, вместо двух. Потому что всё сосредоточено в одном непрерывном блоке кода. Не знаю как в вашем случая, а я ради такой возможности готов мириться с 0,000078 сек. задержкой на каждую функцию.

Замечу ещё, что мой обработчик не требует вставки "Exit Sub". А в вашем случае после копипаста приходится ещё менять "Exit Function" на "Exit Sub", угадал? Ди и время, которое добавляет интерпретация "Exit Sub" сопоставима с временем выполнения "if false"
Обычно я копипастю шаблон процедуры/функции с уже имеющимся обработчиком ошибок, так что копипаст один.
Что касается "Exit Sub" и "Exit Function" — ничто не мешает иметь шаблон для функции и шаблон для процедуры. То же касается и пропертей.
Не согласен, что время выполнения "if false" сопоставимо со временем выполнеия Exit Sub. Exit Sub = просто выход из подпрограммы до её окончания и занимает столько же, как и End Sub. "if false" = проверка условия + переход на End If. Безусловный переход Goto был бы быстрее, но всё равно это избыточный код.
TIA, я Вам завидую белой завистью — Вы так быстро кодируете, что лишний копипаст непозволительная роскошь. У меня на написание кода уходит меньше времени, чем на его обдумывание.
 
A

Akupaka

TIA, я Вам завидую белой завистью — Вы так быстро кодируете, что лишний копипаст непозволительная роскошь. У меня на написание кода уходит меньше времени, чем на его обдумывание
1 - между первым и вторым нет связи
2 - не *цензура*гань )
+ LSI_info, что у неё гораздо больше возможностей (Getthreadinfo по сравнению выглядит атавизмом )) )
есть подозрение, что Getthreadinfo читает значение LSI_info
 
T

TIA

В новом Designer'е есть шаблоны для функций и процедур, куда это один раз добавляется...
Тут лучше бы вспомнили методы аспектного программирования. Обработчики ошибок -- классический пример аспектов.

У меня на написание кода уходит меньше времени, чем на его обдумывание.
Завидую вам, мне во время написания кода не удаётся отключиться и не думать. Потому ценю способы уменьшить время на отвлечения для записи придуманного. :rolleyes: ;)

To All
Речь шла о критериях валидности документа. Обработка эксепшена -- существенная часть проверки. Его конкретная реализация -- нет.
 
K

Klido

кстати, наблюдаю неприятную вещь на 8.5 и 8.5.1 клиентах - строка ошибки обработчиком некорректно возвращается из агента, запускаемого по экшену клиентом... не попадает на 1-3 строки причем вверх/вниз...
особенно убивает, когда возвращает номер строки в центре комментариев из 10 строк :trash:
 
H

hosm

Klido прикольно. а может, просто перекомпилить код надо?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!