Открыть документ из другой БД

  • Автор темы San40S
  • Дата начала
T

TIA

Интересно, как же у меня код тогда работает? :) Я много лет такую конструкцию использую.

В общем набросал тестовый скрипт по быстрому, doc2 получается правильно, никаких ошибок не возникает.


Тут можно даже к справке обратиться

Resume Next
Specifies that when the error occurs, execution continues with the statement following the statement which caused the error. No error-handling routine is executed. The values of the Err, Erl, and Error functions are not reset. (Note that a Resume statement does reset these values.) The error is considered handled.

Конструкция действительно работает и мне из многих вариантов она тоже больше нравится. Единственное, что рекомендую - сбросить Err. Проверьте еще раз скрипт. Doc2 действительно получается, но в следующей строке сбросится в Nothing. Если не сбросится - давайте посмотрим Ваш тестовый скрипт.
 
A

Akupaka

давайте я вас помирю? :)
после использования конструкции on error resume next всегда необходимо сбрасывать код ошибки (err), если он используется в последующем коде, как указывал TIA в своем примере, иначе, можно не париться... я бы советовал париться в любом случае, потому как потом можно просто забыть и ловить (не сразу понятные) ошибки.

вместо
Код:
On Error Resume Next
Set doc = db.getDocumentByUNID()
On Error Goto ErrorHandler
if not(doc is nothing) then...
я рекомендую использовать простой обработчик
Код:
On Error Goto ErrorHandler
On Error 4091 Resume Next
...
Set doc = db.getDocumentByUNID()
if not(doc is nothing) then...
тогда ваш основной обработчик будет выполнять всю остальную грязную работу ;)
если нужна дополнительная обработка со своим отдельным обработчиком, например, протоколирование ошибки отсутствия документа, то просто сделать перенаправление на свою метку...

В общем набросал тестовый скрипт по быстрому, doc2 получается правильно, никаких ошибок не возникает
все правильно, doc2 нормально получается, так и должно быть, если унид верный ;)
но, если ты внимательно присмотришься к примеру TIA, то увидишь, что после получения второго дока, он сканировал код ошибки и изменял значение ссылки doc2 If Err<>0 then Set doc2=Nothing. таким образом, если при получении первого дока возникла ошибка, а второго - нет, то второй док будет сброшен все-равно, хотя логически (по теоретическому задуму) не должен.
в этом случае пример указывает на логическую ошибку алгоритма.
 
T

TIA

я рекомендую использовать простой обработчик
Код:
On Error Goto ErrorHandler
On Error 4091 Resume Next
...
Set doc = db.getDocumentByUNID()
if not(doc is nothing) then...

В случае получения документа по UNID использовать конкретные номера ошибок, не желательно. Слишком много разных ситуаций, а соответственно, и кодов ошибок, связанных с невозможностью открыть документ. Например: нет доступа к документу, сервер отвалился, документ удалён, документа с таким UNID не существует. Однажды, я устал вылавливать все номера ошибок и стал пользоваться просто "On Error Resume Next", что и рекомендую.
К тому же, вендор часто грешит изменением номеров одних и тех же ошибок. Например, помните ли изменение кода ошибки при отмене сохранения UI-документа с 4412 на 4411?
И если уж совсем строго, чтоб с документом нормально можно было работать, мало его получить. Надо бы ещё проверить IsValid, IsDeleted и прочитать любое поле документа, с обработкой ошибки обращения к полю.
 
A

Akupaka

TIA, как-то я пропустил твой ответ ;)
возможно, ты прав, я других ошибок еще не встречал, связанных с операцией открытия документа по униду.
кроме того, изменения номера именно этой ошибки я не наблюдал в 5(старших)-7 версиях Notes.
если у пользователя нет доступа к документу, то метод отрабатывает, документ-объект есть, но прочитать его итемы невозможно (у меня иначе не было) - тут полностью согласен с последними проверками
я бы рекомендовал для этой операции отдельную процедуру :) но сам редко делаю ))
например,

Код:
function GetDocByUnid(ADb as NotesDatabase, AUnid as string) as NotesDocument
dim tdoc as NotesDocument
on error resume next
set tdoc = ADb.GetDocumentByUnid(AUnid)
if not(tdoc is nothing) then
if tdoc.isValid and not(tdoc.isDeleted) and isarray(tdoc.items) then
set GetDocByUnid = tdoc
end if
end if
end function
 
Мы в соцсетях:

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