Форум программистов, компьютерный форум, киберфорум
Наши страницы

Lotus Notes/Domino: Программирование

Войти
Регистрация
Восстановить пароль
 
 
okupoko
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
#1

Обработка ошибок - Lotus

30.05.2010, 11:58. Просмотров 74286. Ответов 64
Метки нет (Все метки)

Всем привет.

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

Кому интересно, из практики:
- результат функции не инициализируется, если в ней возникла необработанная исключительная ситуация, даже, если перед ее возникновением этот результат был назначен.
Т.е.:

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Function F1() As Variant
F1 = False
Error 1000, "Some error"
End Function
 
Sub Initialize()
так использовать нельзя
On Error Resume Next
If F1() Then
Msgbox "F1 returned True"
End If
 
так лучше
Dim F1Res as Variant
On Error Resume Next
F1Res = F1()
If F1Res Then
Msgbox "F1 returned True"
End If
 
причем, если F1Res используется для возврата значений нескольких функций, то перед вызовом функции ее (F1Res) необходимо сбрасывать!
Dim F2Res as Variant
On Error Resume Next
F2Res = True
F2Res = F1()  F1() не вернула результат, но и не сбросила состояние F2Res!!! F2Res == True из предыдущего состояния
If F2Res Then
ЭТОТ код выполнится ошибочно
Msgbox "F1 returned True"
End If
End Sub
Для решения этой проблемы, нужно иметь в функции обязательный обработчик, в котором происходит инициализация возвращаемого значения, при этом, ошибку необходимо передавать либо в результате, либо в иной структуре (возвращаемый параметр, глобальная переменная/объект).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2010, 11:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обработка ошибок (Lotus):

Обработка ошибок! - Lotus
Доброго времени суток! Подскажите плз, есть ли в LotusScript механизм обработки ошибок.При чем не просто OnError goto, а на уровне :...

Обработка ошибок! - Lotus
Где можна взять номера ошибок в лотус скрипт? и еще вопросик: пытаюсь испольховать в качестве лейбла имя подпрограымы , но не знаю...

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

Обработка ошибок, логгирование, трейсинг и юнит-тестинг - Lotus
Хочу поделиться библиотеками для обработки ошибок, логгирования, отслеживания выполнения кода и тестирования компонентов (unit testing)....

В чем причина возникающих критических ошибок - Lotus
Постоянно возникают эти гнусные ошибки при открытии документа на редактирование

Обработка ошибок - VB
используй erl() только если в строке с ошибкой нету номера строки erl() возвращает 0

64
ныш
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,063
30.05.2010, 14:26 #16
А если ошибка возникает уже в обработчике ошибки? Скажем, обработчик уже произошедшей ошибки хочет отправить сообщение по почте, создать документ в базе, зачистить какие-то файлы на уровне ОС и т.п. - и вновь вызывает ошибку. Я в таких случаях пишу "... resume next"...
0
turumboy
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615
30.05.2010, 14:28 #17
Цитата Сообщение от Akupaka
Да? Значит я думаю через жп ))
Меня бы лично такое поведение(значение + exception) повергло в шок:
Пользователь: Компьютер, скока будет дважды два?
Компьютер: Четыре, и, кстати, у тебя канал до сервера отвалился!
Как документировать такую функцию: всегда возвращает верное значение, но иногда при этом бросает ошибку?
Очевидно напрашивается разделение функции на две, каждая из которых будет занимаца своим делом.
0
Mydyvys
0 / 0 / 0
Регистрация: 04.12.2004
Сообщений: 3,329
30.05.2010, 14:38 #18
Цитата Сообщение от turumbay
Ниче не понимаю... Если функция бросает исключение - она ничего не возвращает. Или не так? Можно конечно по сишной традиции возвращать код ошибки, а значение возвращать через входной параметр функции. Но речь вроде идет именно об исключениях?
Исключение мы обработаем внутри. Но с помощью Err можно узнать номер ошибки после выхода из функции. И при желании вызвать еще одно исключение.
Короче, пример. В результате получим и 5, и обработаем ошибку.

Код
Sub test
On Error Goto e
Msgbox(Cstr(errtest))
If Err Then Error Err
Exit Sub
e:
Msgbox Error
Resume
End Sub

Function errtest As Long
On Error Goto e
Dim a As Long, b As Long
b = 1
errtest = 5
errtest = b / 0
Exit Function
e:
Exit Function
End Function
0
ныш
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,063
30.05.2010, 14:48 #19
Цитата Сообщение от Medevic
В результате получим и 5, и обработаем ошибку.
А какая польза-то от этой пятерки? Она же не есть правильное значение, полученное в результате выполнения функции. Хотя если использовать возвращаемое значение как нумератор строк кода... ;)
0
Mydyvys
0 / 0 / 0
Регистрация: 04.12.2004
Сообщений: 3,329
30.05.2010, 14:49 #20
Цитата Сообщение от Мыш
А какая польза-то от этой пятерки? Она же не есть правильное значение, полученное в результате выполнения функции. Хотя если использовать возвращаемое значение как нумератор строк кода... ;)
Да хз. Я таким не пользуюсь.
0
turumboy
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615
30.05.2010, 14:54 #21
Цитата Сообщение от Medevic
Исключение мы обработаем внутри. Но с помощью Err можно узнать номер ошибки после выхода из функции. И при желании вызвать еще одно исключение.
Короче, пример. В результате получим и 5, и обработаем ошибку.
по сути кода: исключение не генерица, при ошибке изменяем глобальную переменную, клиент проверяет эту глобальную переменную.
имхо - очень порочная практика: наличие неочевидных побочных эффектов - это зло. Почему клиенту надо помнить о необходимости проверки Err? Нужно ли клиенту сбрасывать код ошибки?
Если это приватный метод класса - то еще куда ни шло(но если увижу - перепишу ) . А для паблик функций - не годится.
Все же вроде просто: если дело швах и не можем справица в контексте функции - бросаем исключение - пусть вызывающий метод разбираеца. Если в состоянии справица сами(т.е. в контексте) - обрабатываем по месту так, чтобы никто ничего не узнал.
0
okupoko
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
30.05.2010, 15:56 #22
turumbay
Исключение и результат нужны тогда, когда это удобно ;) Это не должно быть правилом.
Как я писал в первом посте в примере. Иногда удобно затулить функцию в IF и в зависимости от результата выполнять некий код или нет.
Но, если в функции возникает необработанное исключение, то IF может выполнить неверное действие.
Пример кода:

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function F1() As Variant
F1 = False
Error 1000, "Some error"
End Function
 
Function F2() As Variant
F2 = False
Error 1000, "Some error"
End Function
 
Sub Initialize()
On Error Resume Next
иногда удобно организовывать проверки каскадом такого вида
но, при неудачном обработчике такой код будет выполняться неверно
If Not(F1()) Then
Msgbox "Проверка 1 неудачна"
ElseIf Not(F2()) Then
Msgbox "Проверка 2 неудачна"
Else
Msgbox "Все проверки удачны"
End If
 
End Sub
теперь, если добавить возврат ошибки, то можно нарисовать так


LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Function F1() As Variant
On Error Goto ERH
F1 = False
Error 1000, "Some error"
ERH:
Call SetErrorState(...)
F1 = False
Exit Function
End Function
 
Function F2() As Variant
F2 = False
Error 1000, "Some error"
End Function
 
Sub Initialize()
On Error Resume Next
иногда удобно организовывать проверки каскадом такого вида
но, при неудачном обработчике такой код будет выполняться неверно
If Not(F1()) Then
Msgbox "Проверка 1 неудачна в следствие ошибки " & GetErrorText(...)
ElseIf Not(F2()) Then
Msgbox "Проверка 2 неудачна"
Else
Msgbox "Все проверки удачны"
End If
 
End Sub
Этот возврат можно сделать очень по-разному. Это может быть параметр вызываемых функций, это может быть внутренний глобальный объект, как удобно.
И ничего порочного нет, если использовать правильно



Цитата Сообщение от turumbay
Почему клиенту надо помнить о необходимости проверки Err? Нужно ли клиенту сбрасывать код ошибки?
Можно сделать так, чтобы это было необязательным!
С таким же успехом я могу воскликнуть: "А зачем клиенту помнить о необходимости правильного обработчика?!"
Функция молча возвращает неуспешный результат! А не непредсказуемый. И программист может эго использовать при необходимости.
0
mvyush
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
30.05.2010, 16:11 #23
Akupaka
Всё, конечно, от ситуации зависит, но в приведённом примере я вижу настойчивое желание использовать On Error Resume Next и сетовать, что If не правильно отрабатывает. Думаю, что лучше всё-таки использовать On Error Goto ERH и уже в обработчике определять где и какая ошибка возникла.



Добавлено:


Цитата Сообщение от Akupaka
Функция молча возвращает неуспешный результат! А не непредсказуемый. И программист может эго использовать при необходимости.
В WinAPI встречается такое — прежде чем использовать результат функции, нужно проверить, не возникла ли ошибка. Но, честно говоря, никогда не сталкивался с необходимостью такого подхода при программировании на ЛС.
0
okupoko
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
30.05.2010, 16:26 #24
Цитата Сообщение от nvy
Всё, конечно, от ситуации зависит, но в приведённом примере я вижу настойчивое желание использовать On Error Resume Next и сетовать, что If не правильно отрабатывает
Я не сетую, что он неправильно работает ;) Я говорю, что некоторые конструкции выполняются некорректно, при подобном подходе, а иногда его использовать удобнее.
0
turumboy
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615
30.05.2010, 17:11 #25
Цитата Сообщение от Akupaka
Исключение и результат нужны тогда, когда это удобно Это не должно быть правилом.
Да не может быть это удобно никогда. Реальный пример в студию!


Цитата Сообщение от Akupaka
Как я писал в первом посте в примере. Иногда удобно затулить функцию в IF и в зависимости от результата выполнять некий код или нет.
Желание нормальное. Вот код из упомянуго шаблона discussion

Код
Private Function HasUI As Boolean
On Error Goto ERROR_HANDLER
Dim oUIWorkspace As New NotesUIWorkspace
HasUI = True
Exit Function
ERROR_HANDLER:
Err = 0
Exit Function
End Function
Все четко и ясно. Функция делает ровно то, что от нее ожидается. То что внутре генерица исключение - никто кроме нее не знает.


Цитата Сообщение от Akupaka
Но, если в функции возникает необработанное исключение, то IF может выполнить неверное действие.
Это может произойти ТОЛЬКО в случае resume next - т.е. когда вы намеренно игнорируете исключение. Вывод очевиден - не использовать resume next без крайней нужды.
А у вас вызывающий код знает особенности реализации вызываемой функции. А ему этого знать не положено!



Цитата Сообщение от nvy
В WinAPI встречается такое — прежде чем использовать результат функции, нужно проверить, не возникла ли ошибка.
Это так только потому, что в си нету исключений. Так что конструкция эта - вынужденная.
0
okupoko
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
30.05.2010, 18:13 #26
Цитата Сообщение от turumbay
А у вас вызывающий код знает особенности реализации вызываемой функции. А ему этого знать не положено!
Это почему, если это мои два класса и они между собой связаны? О.о ))
Не надо чесать все одной расческой ;)


Цитата Сообщение от turumbay
Это может произойти ТОЛЬКО в случае resume next - т.е. когда вы намеренно игнорируете исключение
Нет, ну это ж надо быть таким упрямым Я же говорю, что мне иногда это удобнее использовать.


Цитата Сообщение от turumbay
Реальный пример в студию!
Пример был выше в 22-м посте. Между прочим, он был адресован тебе



Цитата Сообщение от turumbay
Все четко и ясно. Функция делает ровно то, что от нее ожидается. То что внутре генерица исключение - никто кроме нее не знает
Дык, у меня тоже четко и ясно, и никто выше не знает, что в вызываемой функции было исключение :(
Но кроме результата, что функция выполнилась неудачно, есть еще код ошибки.
0
OtykSmyrmov
0 / 0 / 0
Регистрация: 01.01.2010
Сообщений: 29
13.06.2010, 16:57 #27
Хорошая тема, Akupaka!

Я делаю таким образом:
1. есть либа, а точнее функция, которая обрабатывает ошибки в скриптах
2. при написании кода юзаем ее с параметрами

Подробнее:

Либа:

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Option Public
Option Declare
 
%REM
<information>
<description>
Библиотека для обработки ошибок в скриптах
</description>
 
<input params>
...
</input params>
 
<output params>
...
</output params>
 
<result>
...
</result>
 
<others>
Пример вызова ProcessError:
Call ProcessError (LIB_NAME, Err, Error, Erl, Lsi_info (2), Lsi_info (12))
</others>
</information>
%END REM
Private Const MODULE_NAME = "Библиотека <libError>"
 
Function ProcessError (moduleName As String, errNum As Variant, errDescr As Variant, _
errLine As Integer, errorPlace As String, callBy As String)
%REM
<information>
<description>
Функция обрабатывает ошибку
</description>
 
<input params>
moduleName - имя модуля, в котором произошла ошибка
errNum - номер ошибки
errDescr - описание ошибки
errLine - строка, в которой произошла ошибка
errorPlace - имя функции, в которой возникла ошибка
callBy - имя функции, которая вызвала, функцию, в которой возникла ошибка
</input params>
 
<output params>
...
</output params>
 
<result>
True - процесс обработки ошибки завершен удачно
False - во время обработки ошибки возникли ошибки
</result>
 
<others>
...
</others>
</information>
%END REM
 
On Error Goto errorHandler
 
Dim session As New NotesSession
 
Dim db As NotesDatabase
 
Dim logA As cscLOG
 
Print moduleName , errorPlace & " called by " & callBy , "ошибка № " & errNum & ": " & errDescr & " (line: " & Cstr (errLine) & ")"
 
Msgbox moduleName & "." & Chr (13) & _
"Функция " & errorPlace & " called by " & callBy & "." & Chr (13) &_
"Ошибка № " & errNum & ": " & errDescr & " (line: " & Cstr (errLine) & ").", 16, "Ошибка"
 
Set db = session.CurrentDatabase
 
Set logA = New cscLOG
 
Call logA.AppendText (LOG_ITEM_TYPE_ERROR, LOG_ACTION_TYPE_ERROR, "бд: " & db.Title & " (Сервер = " & db.Server & ", путь = " & db.FilePath & "), модуль: " & moduleName & ", " & errorPlace & " called by " & callBy & ". Ошибка № " & errNum & ": " & errDescr & " (line: " & Cstr (errLine) & ")")
 
ex:
Exit Function
 
errorHandler:
Print MODULE_NAME , Lsi_info (2) & " called by " & Lsi_info (12) , "ошибка № " & Err & ": " & Error$ & " (line: " & Cstr (Erl) & ")"
 
Msgbox "Библиотека " & MODULE_NAME & "." & Chr (13) & _
"Функция " & Lsi_info (2) & " called by " & Lsi_info (12) & "." & Chr (13) &_
"Ошибка № " & Cstr (Err) & ": " & Error$ & " (line: " & Cstr (Erl) & ").", 16, "Ошибка"
 
Resume ex
End Function
Использование:

LotusScript
1
2
3
4
5
6
7
8
9
...
 
ex:
Exit Function
 
errorHandler:
Call ProcessError (MODULE_NAME, Err, Error, Erl, Lsi_info (2), Lsi_info (12))
Resume ex
End Function
Хорошо бы еще доработать со временем код. Как вариант можно добавить версию кода, вроде:

LotusScript
1
2
Private Const MODULE_NAME = "Библиотека <libError>"
Private Const VERSION_NAME = "1.0.0"
Akupaka, надеюсь то :gifts:
0
VtodSh
0 / 0 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
13.06.2010, 17:29 #28
Цитата Сообщение от nvy
В библиотеках обработчик ошибки возвращает ошибку наверх, а вот в кнопках и событиях ошибки обрабатываются и логируются. В результате всегда (почти) можно посмотреть, откуда у ошибки "ноги растут".
Я делаю почти также. Идея была где-то здесь. И с lsi_info, ничего не вылетает.
0
turumboy
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615
14.06.2010, 12:32 #29
Цитата Сообщение от OlegSmirnov
1. есть либа, а точнее функция, которая обрабатывает ошибки в скриптах
понимаю, что код не ваш, но т.к. автор не указан - спрошу у вас:
что делает приведенная функция? это пример использования on error goto?
- почему print+msgbox не оформлено в виде отдельной процедуры для устранения дублирования в теле функции и в обработчике ошибок?
- зачем у этой функции errhandle? очевидно, что ошибка может возникнуть только внутри класса cscLOG. Почему класс не в состоянии обработать ее самостоятельно?
- зачем собсно одновременно используется print и msgbox?
- у Err и Error глобальная область видимости, зачем передавать их в обработчик?
- почему не сбрасывается err?
- что делать, если надо передать ошибку в вызывающую функцию( т.е. где возможность передачи вверх по стеку вызовов) ?
З.Ы. Чем вызвано использование "псевдо XML" для документирования? Есть какая-нить хитрая тулза для построения документации?
Почему используются тэги, содержащие пробелы?
0
Kyy_Kyykkymym
0 / 0 / 0
Регистрация: 01.10.2006
Сообщений: 615
14.06.2010, 12:49 #30
т.к. я не нашел красивого решения с обработчиком ошибок, то использую только процедуру

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
Sub ErrH(thread As String, condition As Boolean)
%REM
Вывод сообщения об ошибке
%END REM
Dim msg As String
msg = "Ошибка " + Cstr(Err) + ": " + Error + ", в строке " + Cstr(Erl) + " в процессе " + thread + " (" + procID  + ")"
If condition Then
Msgbox msg, 16, "Lotus Notes error"
Else
Print msg
End If
End Sub
только procID глобально использую, но можно и без нее


LotusScript
1
2
3
4
5
6
7
8
9
10
Function f()
 
try:
On Error Goto catch
..
Exit Function
catch:
Call errh( Getthreadinfo(1), False)
Exit Function
end function
можно, конечно классы, синглетоны или еще что-то использовать, но как-то нет в этом особого преимущества
0
14.06.2010, 12:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2010, 12:49
Привет! Вот еще темы с ответами:

обработка ошибок - C++
Есть класс треугольника, нужно, чтобы при вводе в конструктор нулей или минусовых значений вместо сторон, выдавало ошибку,получается...

Обработка ошибок - VBA
Можно в одной процедуре использовать 2 раза On Error GoToсоответственно для одной части кода и для другой части кода? Если можно, то...

Обработка ошибок - Delphi
Почему все таки возникают иногда ошибки при обработке: Stream := TIdMultipartFormDataStream.Create; //поток для веб try ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru