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

Serduko

Well-known member
11.10.2011
170
0
#1
Уважаемые коллеги.

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

Например:
Код:
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
 

ty3uk

Well-known member
31.03.2008
170
0
#2
не совсем понял о чём речь... если убрать resume то ошибка провалиться выше по всем функциям, которые вызывали данную процедуру...
с помощью resume вы как-бы говорите что ошибку подправили, ну, может, и подправите её? :)
у меня код посложней будет

Код:
	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
 

savl

Lotus team
28.10.2011
2 136
105
#3
Serduko
Можно (нужно) сделать из процедуры функцию, которая возвращает True/False и проверять.
Другого нет, на сколько я знаю. Да и обработкой результата всегда удобнее.
 

Serduko

Well-known member
11.10.2011
170
0
#4
не совсем понял о чём речь... если убрать resume то ошибка провалиться выше по всем функциям, которые вызывали данную процедуру...
с помощью resume вы как-бы говорите что ошибку подправили, ну, может, и подправите её? :)
у меня код посложней будет
Если у брать resume будет ошибка "No resume".
У меня класс ExceptionHandler как в Java, просто я не стал его показывать, что бы не грузить. В идеале, хочу добавить подобие stack trace.

Добавлено:
Serduko
Можно (нужно) сделать из процедуры функцию, которая возвращает True/False и проверять.
Другого нет, на сколько я знаю. Да и обработкой результата всегда удобнее.
Жаль, многие функции приспособлены для возврата других данных, глобально не реализовать или точнее, будет слишком запутанно.
 

ty3uk

Well-known member
31.03.2008
170
0
#6
Код:
Если у брать resume будет ошибка "No resume".
У меня класс ExceptionHandler как в Java, просто я не стал его показывать, что бы не грузить. В идеале, хочу добавить подобие stack trace.
Вот как бороться с "No resume" меня очень сильно волнует. Т.к. клиенты постоянно шлёт такое, вот, ошибка! Причём, не скрин всего эжкрана, а только этот диалог...

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


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


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

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

Вложения

Serduko

Well-known member
11.10.2011
170
0
#7
Код:
Если у брать resume будет ошибка "No resume".
У меня класс ExceptionHandler как в Java, просто я не стал его показывать, что бы не грузить. В идеале, хочу добавить подобие stack trace.
Вот как бороться с "No resume" меня очень сильно волнует. Т.к. клиенты постоянно шлёт такое, вот, ошибка! Причём, не скрин всего эжкрана, а только этот диалог...

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


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


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

Вот что меня бесит, и я не знаю как это решить, это номер строки, если ошибка вылезла в классе. Ктонить знает как решить? :)
Нашел как бороться с "No resume", вероятно так и сделаю
Код:
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
 

savl

Lotus team
28.10.2011
2 136
105
#8
Значит не так понял, думал при ошибке в процедуре - обрывать весь агент.
А стек сделать легко, можно и через GetThreadInfo, можно и классикой возвращать наверх просто: Error Err, Error$
Это вернет ошибку на уровень вверх, но надо будет иметь обработчик в каждом уровне + изменить текст ошибки для лучшего восприятия.

Вот как бороться с "No resume" меня очень сильно волнует.
Resume ... можно заменить на Exit Sub / Exit Function / Exit Property, тогда не будет вылезать "no resume"
 

Serduko

Well-known member
11.10.2011
170
0
#9
Значит не так понял, думал при ошибке в процедуре - обрывать весь агент.
А стек сделать легко, можно и через GetThreadInfo, можно и классикой возвращать наверх просто: Error Err, Error$
Это вернет ошибку на уровень вверх, но надо будет иметь обработчик в каждом уровне + изменить текст ошибки для лучшего восприятия.


Resume ... можно заменить на Exit Sub / Exit Function / Exit Property, тогда не будет вылезать "no resume"
Спасибо, лишние метки уберу, были сомнения, что Exit Sub корректно сработает, теперь нет. (Плюсамет закончился :) )
 

ty3uk

Well-known member
31.03.2008
170
0
#10
Код:
Resume ... можно заменить на Exit Sub / Exit Function / Exit Property, тогда не будет вылезать "no resume"
т.е. тупо, в обработчике ошибки, перед end sub, вставить exit sub ?
эээ... надо попробовать.... главное, чтоб при этом, остальное дерево ошибок не потерялось (ато функция print_zz может быть во многих местах, и хочется понимать, откуда оно вызывалось....)

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

Serduko

Well-known member
11.10.2011
170
0
#11
Код:
Resume ... можно заменить на Exit Sub / Exit Function / Exit Property, тогда не будет вылезать "no resume"
т.е. тупо, в обработчике ошибки, перед end sub, вставить exit sub ?
эээ... надо попробовать.... главное, чтоб при этом, остальное дерево ошибок не потерялось (ато функция print_zz может быть во многих местах, и хочется понимать, откуда оно вызывалось....)

а с номером строки в классах, нет решения? :)
Я в handler передаю название процедуры + Erl
 

ty3uk

Well-known member
31.03.2008
170
0
#13
:) такая маленькая, а уже наташа... Ну, хоть понял как считать, а то, была загадка...
 

savl

Lotus team
28.10.2011
2 136
105
#14
Ty3uK
Можно проще, перейти в сам класс, нажать Ctrl+alt+L и указать номер строки из обработчика - перейдет куда надо.