Передать Ошибку С Прекращением Исполнения Программы

Тема в разделе "Lotus - Программирование", создана пользователем Serduko, 23 июл 2014.

  1. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Уважаемые коллеги.

    Подскажите есть ли возможность обработки исключения с прекращением исполнения потока? При условии что исключение вызывается не в инициализирующей процедуре, а ниже и в инициализирующей процедуре нет обработки исключения?

    Например:
    Код (LotusScript):
    Sub Initialize

    Call test2

    End Sub

    Sub test
    On Error GoTo errorsSection

    Dim col As NotesDocumentCollection
    Dim doc As NotesDocument

    Set doc = col.Getfirstdocument()

    quit:
    Exit Sub
    errorsSection:
    msgbox "Ошибка #" + CStr(Err) + ", в [test] строка #" + CStr(Erl) + " : " + Error$
    'Здесь прекращение исполнения потока
    Resume quit
    End Sub
     
  2. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    не совсем понял о чём речь... если убрать resume то ошибка провалиться выше по всем функциям, которые вызывали данную процедуру...
    с помощью resume вы как-бы говорите что ошибку подправили, ну, может, и подправите её? :)
    у меня код посложней будет

    Код (LotusScript):
        Sub ER_Error(t_name As String,t_doc As NotesDocument)
    ''вывести ошибку по документу t_doc с названием процедуры t_name
    '''новая поправочка, t_name эже не процедура, а комментарий к ней, название процедуры, тепер, вытаскивается автоматом;-)
    Dim db As NotesDatabase
    Dim ses As New NotesSession
    Set db=ses.Currentdatabase
    'Print "("+db.Title+") Error in "+LSI_Info(12)+" at: "+CStr(Erl())+" with error("+CStr(Err())+{): "}+Error(Err)+{" With comments: "}+t_name+{"}
    Print "("+db.Title+") Error in "+CStr(GetThreadInfo(10))+"("+CStr(GetThreadInfo(11))+")"+" at: "+CStr(Erl())+" with error("+CStr(Err())+{): "}+Error(Err)+{" With comments: "}+t_name+{"}
    If (CUR.Er) Then
    Dim e_doc As NotesDocument
    Set e_doc=New NotesDocument(db)
    e_doc.Form="(error)"
    e_doc.place=CStr(GetThreadInfo(10))+"("+CStr(GetThreadInfo(11))+")"
    e_doc.errline=CStr(Erl())
    e_doc.error=CStr(Err())
    e_doc.serror=Error(Err)
    e_doc.comments=t_name
    If Not(er_errdoc Is Nothing) Then
    Call e_doc.Makeresponse(er_errdoc)
    End If
    Call e_doc.Computewithform(True,True)
    Call e_doc.Save(True,True)
    Set er_errdoc=e_doc
    End If
    End Sub
     
  3. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Serduko
    Можно (нужно) сделать из процедуры функцию, которая возвращает True/False и проверять.
    Другого нет, на сколько я знаю. Да и обработкой результата всегда удобнее.
     
  4. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Если у брать resume будет ошибка "No resume".
    У меня класс ExceptionHandler как в Java, просто я не стал его показывать, что бы не грузить. В идеале, хочу добавить подобие stack trace.

    Добавлено:
    Жаль, многие функции приспособлены для возврата других данных, глобально не реализовать или точнее, будет слишком запутанно.
     
  5. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Нашел:

    Код (LotusScript):
    On Error GoTo 0
     
  6. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    Код (LotusScript):
    Если у брать resume будет ошибка "No resume".
    У меня класс ExceptionHandler как в Java, просто я не стал его показывать, что бы не грузить. В идеале, хочу добавить подобие stack trace.
    Вот как бороться с "No resume" меня очень сильно волнует. Т.к. клиенты постоянно шлёт такое, вот, ошибка! Причём, не скрин всего эжкрана, а только этот диалог...

    Собственно, процедура которую я показал, она и возdращает подобие stack trace. Эта процедура из библиотечки "ускорялки" (ну та в которой ses, ws, curdoc, curuidoc, getdocumentbyid, getprofiledoc и т.д. большой класс с полезными функционалом). вот выхлоп при включенном логере (тут старый код, использовалось LSI_info, сейчас переделано)


    Добавлено: помимо этого, в дизайнере (который эклипсовский, т.е. когда библиотечки пишешь), у меня автоматом забито
    Код (LotusScript):
        On Error GoTo errplace


    Exit Function
    errplace:
    Call er_error("",Nothing)
    Т.е. при создании функции, у меня, сразу, обработчик вставляется.

    Вот что меня бесит, и я не знаю как это решить, это номер строки, если ошибка вылезла в классе. Ктонить знает как решить? :)
     

    Вложения:

    • error.png
      error.png
      Размер файла:
      35,4 КБ
      Просмотров:
      44
  7. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Нашел как бороться с "No resume", вероятно так и сделаю
    Код (LotusScript):
    Sub Initialize
    On Error GoTo errorsSection

    Call test2

    Dim col As NotesDocumentCollection
    Dim doc As NotesDocument

    Set doc = col.Getfirstdocument()

    quit:
    Call exceptionHandler.alertStackTrace()
    Exit Sub
    errorsSection:
    Call exceptionHandler.addSystemException("Initialize")
    Resume quit
    End Sub

    Sub test2
    On Error GoTo errorsSection

    Dim col As NotesDocumentCollection
    Dim doc As NotesDocument

    Set doc = col.Getfirstdocument()

    quit:
    Exit Sub
    errorsSection:
    Call exceptionHandler.addSystemException("test2")
    Error 11111 'User исключение
    Resume quit
    End Sub
     
  8. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Значит не так понял, думал при ошибке в процедуре - обрывать весь агент.
    А стек сделать легко, можно и через GetThreadInfo, можно и классикой возвращать наверх просто: Error Err, Error$
    Это вернет ошибку на уровень вверх, но надо будет иметь обработчик в каждом уровне + изменить текст ошибки для лучшего восприятия.

    Resume ... можно заменить на Exit Sub / Exit Function / Exit Property, тогда не будет вылезать "no resume"
     
  9. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Спасибо, лишние метки уберу, были сомнения, что Exit Sub корректно сработает, теперь нет. (Плюсамет закончился :) )
     
  10. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    Код (LotusScript):
    Resume ... можно заменить на Exit Sub / Exit Function / Exit Property, тогда не будет вылезать "no resume"
    т.е. тупо, в обработчике ошибки, перед end sub, вставить exit sub ?
    эээ... надо попробовать.... главное, чтоб при этом, остальное дерево ошибок не потерялось (ато функция print_zz может быть во многих местах, и хочется понимать, откуда оно вызывалось....)

    а с номером строки в классах, нет решения? :)
     
  11. Serduko

    Serduko Well-Known Member

    Регистрация:
    11 окт 2011
    Сообщения:
    174
    Симпатии:
    0
    Я в handler передаю название процедуры + Erl
     
  12. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Ty3uK
    Serduko
    про неверную сроку тут
     
  13. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    :) такая маленькая, а уже наташа... Ну, хоть понял как считать, а то, была загадка...
     
  14. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Ty3uK
    Можно проще, перейти в сам класс, нажать Ctrl+alt+L и указать номер строки из обработчика - перейдет куда надо.
     
Загрузка...

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