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

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

  1. allex

    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
     
  2. nvyush

    nvyush Lotus team
    Lotus team

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

    allex Гость

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

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Создать библу с обработчиком. Можно с очень извращённым :welcome: Вызывать из любых мест))
    Соединить это с функциалналом записи ошибок в лог. Этого будет выше крыши.
    Дополнительно, для облегчения себе дальнейшей жизни, использовать Lsi_info(12) и Lsi_info(14).
     
  5. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Как я понимаю, про вид обработчика тут речь не идёт, просто allex'у не охота в начале каждой процедуры писать
    Код (Text):
    On Error Goto Errh
    , а в конце обработчик.
    Но, к сожалению, такова наша лотусная судьбинушка :welcome:
     
  6. amigolinx

    amigolinx Гость

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

    allex Гость

    Зацени примерчик...
     
  8. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    TIA
    Конструкция вида "if False then" меня повергла в шок :). Потом сообразил, что это. КМК, лишний if не способствует производительности.
    Обычно оформляю обработку ошибок так:
    Код (Text):
    Sub SomeSub()
    On Error Goto ErrHandler
    ...
    ExitSub:
    Exit Sub
    ErrHandler:
    MsgBox "Error " & Err & " (" & Error & ") in line " & Erl
    Resume ExitSub
    End Sub
    или так (для трассировки):
    Код (Text):
    Sub SomeSub()
    On Error Goto ErrHandler
    ...
    Exit Sub
    ErrHandler:
    Error & Chr(10) & "in " & Getthreadinfo(LSI_THREAD_PROC) & " line " & Cstr(Erl)
    End Sub
     
  9. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    nvy
    +1

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    ну, не тяни, используй значения, их там аж два-три обычно :)

    ого, конструкция :)
     
  11. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Пользую Getthreadinfo, т.к. LSI_info — функция недокументированная.
    Файл констант можно не тянуть, а посмотреть значения в справке по Getthreadinfo. Однако с константами, кмк, читабельней.
     
  12. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    :) Это ожидаемо. Мне самому не приятно. И необходимость использовать Goto меня тоже раздражает. Но это осознанный выбор из других альтернатив.

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

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    хитрец :)
     
  14. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Getthreadinfo тоже была когда-то недокументируемой :)
    А то, что LSI_info в хэлпе недокументируема, так это не страшно; хотя указание в keywords на неё всё же есть, да и в Designer'е она подсвечивается как надо)) Доказательство её будущего использования то, что однажды в неё добавили возможность анализа памяти; если бы хотели забить, то не добавляли бы.
    + LSI_info, что у неё гораздо больше возможностей (Getthreadinfo по сравнению выглядит атавизмом )) ), да и короче она в написании :)

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

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Обычно я копипастю шаблон процедуры/функции с уже имеющимся обработчиком ошибок, так что копипаст один.
    Что касается "Exit Sub" и "Exit Function" — ничто не мешает иметь шаблон для функции и шаблон для процедуры. То же касается и пропертей.
    Не согласен, что время выполнения "if false" сопоставимо со временем выполнеия Exit Sub. Exit Sub = просто выход из подпрограммы до её окончания и занимает столько же, как и End Sub. "if false" = проверка условия + переход на End If. Безусловный переход Goto был бы быстрее, но всё равно это избыточный код.
    TIA, я Вам завидую белой завистью — Вы так быстро кодируете, что лишний копипаст непозволительная роскошь. У меня на написание кода уходит меньше времени, чем на его обдумывание.
     
  16. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    1 - между первым и вторым нет связи
    2 - не *цензура*гань )
    есть подозрение, что Getthreadinfo читает значение LSI_info
     
  17. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Тут лучше бы вспомнили методы аспектного программирования. Обработчики ошибок -- классический пример аспектов.

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

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

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Точно.
     
  19. Klido

    Klido Гость

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Klido прикольно. а может, просто перекомпилить код надо?
     
Загрузка...
Похожие Темы - Отработать Onerror глобально
  1. imendan
    Ответов:
    26
    Просмотров:
    2.393

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