Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/347: Рейтинг темы: голосов - 347, средняя оценка - 4.63
0 / 0 / 1
Регистрация: 30.06.2007
Сообщений: 2,153

Когда имеет смысл ставить "on Error Resume Next"

18.03.2009, 15:13. Показов 64174. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня разработчикам!

Как известно, у нормального лотусного программиста функция выглядит так:

Code
1
2
3
4
5
6
7
8
Function Function_name
On Error Goto Errh
Тело функции
Exit Function
Errh:
Call ErrHandler
Exit Function
End Function
Сам errorhandler может немного отличаться, я про саму конструкцию.

Но при этом внутри ф-ии иногда используется конструкция вида

Code
1
2
3
On Error Resume Next
Потенциально опасная операция
On Error Goto Errh
Хотел поинтересоваться, кто и когда использует вторую конструкцию и вообще стоит ли её использовать.

Что бы не быть голословным приведу примеры, что зачастую ставлю внутрь "On Error Resume Next":
1. Set doc = db.GetDocumentByID/UNID(ID) (ну это у меня вынесено в отдельную ф-ию)
2. Call Dc.AddDocument(doc)
3. MkDir
4. Kill
5. RmDir
6. Dir

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

Code
1
2
3
4
5
On Error Resume Next
Error 1001
Потенциально опасная операция
On Error Goto Errh
If Err <> 1001 Then Потенцально опасная операция таки вывалилась :)
Вообщем, вопрос таков: кто для чего испрользует эти конструкции, стоит ли вообще их использовать и где кончается нормальная практика и начинается злоупотребление?
Спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.03.2009, 15:13
Ответы с готовыми решениями:

Имеет ли смысл ставить Win8
Сейчас уже виндовс 8.

Имеет ли смысл ставить больше памяти?
Здравствуйте. Купил новый ноутбук, где оперативаня папять 4+4. Одна из них впаяно прямо на матплате. Можно сделать апгрейд и будет 8+4....

Антивирус бесплатный имеет ли смысл ставить?
Добрый. имеет ли смысл ставить бесплатный антивирус или репакнутую сборку платного антивируса? на мой нубский взгляд бесплатный антивир...

35
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
18.03.2009, 16:24
не ну взял и все наиболее употр*цензура*емые варианты перечислил...
например, NotesDatabase.Open()...
в общем, в любом случае, когда нужно получить результат некоторой операции и пойти дальше, а не париться с обработкой...
0
0 / 0 / 1
Регистрация: 30.06.2007
Сообщений: 2,153
18.03.2009, 16:52
Кстати db.Open я раньше тоже иногда ставил в такой обработчик.
Сейчас юзаю конструкцию, которая пока что работает железно:

Code
1
2
3
4
5
6
7
dym db as New notesDatabase("", "")
Call db.Open(Some_Server, Some_Path)
if db.IsOpen then
Всё в поряде
else
Скорее всего ошибка в Some_Server/Some_Path
End if
Я к чему спросил-то?
Тут услышал из уст коллеги, что On Error Resume Next не надо использовать никогда.
Вот и решил узнать, один ли я столь убог, что юзаю On Error Resume Next
0
0 / 0 / 0
Регистрация: 04.12.2004
Сообщений: 3,329
18.03.2009, 17:00
Я редко использую, т.к. в случае ошибки часто нельзя выполнять следующую строку.
Например:

Code
1
2
Set doc = db.GetDocumentByID/UNID(ID)
Call doc.ReplaceItemValue("", "")
Обычно я использую следующую конструкцию:

Code
1
2
3
4
5
6
7
8
9
10
Function Function_name
On Error Goto Errh
Тело функции
Process:
Тело функции
Exit Function
Errh:
обрабатываем ошибку, если надо
Resume Process
End Function
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
18.03.2009, 17:41
Цитата Сообщение от Omh
Тут услышал из уст коллеги, что On Error Resume Next не надо использовать никогда.
дай ему под коленку, скажи, что убогие программеры кодебая передают привет!
а чем он это аргументировал? или он какой-то явист или ему подобный, лихо использующий try {} catch {}?
0
0 / 0 / 0
Регистрация: 13.10.2005
Сообщений: 848
18.03.2009, 23:24
мои 5 копеек.
вообще у нас принято в обязательном порядке использовать обработчик ошибок вида

function f_name (params) as boolean
On Error Goto ErrorHandler
f_name = false
код
f_name = true
Ex:
Exit Function
ErrorHandler:
обработка ошибки
Resume Ex
End Function

что касается Resume Next, то часто использую в связке с db.GetDocumentByUNID

on error 4091 resume next
Set doc = db.GetDocumentByUNID (unid)

if (doc is Nothyng) then

ну и так далее.

использовать же

On Error Goto ErrorHandler
On Error Resume Next
код для проверки
On Error Goto ErrorHandler

на мой взгляд не совсем красиво, ибо может запутывать логику.
я бы постарался код для проверки выделить в функцию.
но в конструкции не вижу ничего криминального.
0
0 / 0 / 0
Регистрация: 30.11.2007
Сообщений: 43
19.03.2009, 07:34
Как мне кажется все ошибки должны обрабатываться в одном месте:

sub Test
on error goto ErrEx:

exit sub

ErrEx:
Select Case Err
Case 1001:print "User Error 1001"
Case 1002:print "User Error 1002"
Case 1003:print "User Error 1003"
Case 1004:Print "User Error 1004"
Case 4091: resume Next
Case Else
print cstr(Er)
End Select
exit sub
end sub
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
19.03.2009, 10:47
Цитата Сообщение от olegber
Как мне кажется все ошибки должны обрабатываться в одном месте
в очень многих случаях, ошибку просто не нужно обрабатывать как-нибудь особенно, просто нужно, чтобы программа не выпала в осадок из-за ее возникновения, в этих случаях и используется "местная" конструкция, т.к. в ином случае приходится "бегать смотреть" что же там делается...
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
20.03.2009, 12:12
как и везде кетч эксепшн и продолжение выполнения, происходит в местах, где использование кода (часто не тобой написанного) может вызвать исключение, но оно ситуативно некритично и решение нужно вынести в др. месте программы (а здесь - отметить ситуацию)

как пример - файловые операции типа удаления и создание каталога, файлов
файл удален уже или не был создан, каталог уже существует (а доп. проверка - тот же код)

или вариант когда не хотелось бы в обработке исключения добавлять код, кот. тоже может вызвать исключение
0
0 / 0 / 0
Регистрация: 20.10.2008
Сообщений: 271
03.05.2009, 15:41
Вот еще всплыл случай необходимости использования.

Во время работы ночного агента пришлось поставить обработчик, т.к. проблема с 32к при сохранении.

On Error Resume Next
Err = 0
mdoc.Save True, False
If Err Then
Print {...}
End If
On Error Goto errorproc
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
04.05.2009, 12:01
ага, я на сохранение дока тож вешаю, но иначе

Code
1
2
3
4
5
6
7
On Error Resume Next
if not(mdoc.Save(True, False)) then
If Err <> 0 Then
...
end if
end if
On Error Goto errorproc
потому как ошибка бывает не только на 32К, а и прав может не хватить и вообще, сохранение штука вредная
правда, если док не новый, и фактически не был изменен, то Save вернет False, поэтому дополнительная проверка на код ошибки не мешает...
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
02.02.2010, 13:16
На собственном опыте убедился, что если можно (а оно можно, если постараться), то лучше обойтись без On Error Resume Next.
Был в шоке, когда в вызываемой процедуре для GetDocumentByUNID указал On Error Resume Next, но обработчик ошибок вызывающей процедуры выдал мне Err = 4091! Это было... точно не помню, вроде в фоновых агентах. Стали ставить принудительно Err = 0, но в некоторых особо хитрых случаях (не помню - здесь вы мне можете или верить или не верить) не работало и это!
Пришли к тому, что лучше использовать культурный метод для обнуления ошибки On Error Goto 0.
Применительно к GetDocumentByUNID это выглядит так:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function GetNDbyUNID(NDB As NotesDatabase, UNID As String, ND_Result As NotesDocument) As Boolean
Set ND_Result = Nothyng
If NDB Is Nothyng Then Exit Function
 
On Error 4091 Goto Err4091
Set ND_Result = NDB.GetDocumentByUNID(UNID)
If Not ND_Result Is Nothyng Then
GetNDbyUNID = IsDocAccessed(ND_Result, True)    Где-то здесь уже выкладывал эту функцию
Else
On Error Goto 0                             Собственно оно и есть
End If
 
Exit Function
 
Err4091:
Resume Next                                     "Финт ушами"
End Function
Но это если мы хотим использовать одну и ту же функцию в любых случаях.
Если не запариваться на повторность кода, то можно писать что хочешь и как хочешь, - копипастить и в каждом случае производить отладку заново...
0
0 / 0 / 0
Регистрация: 04.11.2007
Сообщений: 3,019
02.02.2010, 13:33
Тут услышал из уст коллеги, что On Error Resume Next не надо использовать никогда.
Вот и решил узнать, один ли я столь убог, что юзаю On Error Resume Next
горячо поддерживаю твоих коллег

Обьясню, уже достаточно давно всё дроблю на мелкие функции, которые обязательно возвращают True если доходят до конца
а основное ядро просто глядит на возврат функции тем самым лавируя по логике
в мелких же функция никогда не юзается Resume Next там или выход или обход конкретной ошибке
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
02.02.2010, 15:32
Цитата Сообщение от ToxaRat
горячо поддерживаю твоих коллег
и тебе тоже под коленку, ага



Цитата Сообщение от VladSh
Стали ставить принудительно Err = 0, но в некоторых особо хитрых случаях (не помню - здесь вы мне можете или верить или не верить) не работало и это!
очень интересно, что не срабатывало О.о еще было бы лучше знать наверняка глюк ли это нотеса/домино или в коде недочет...
тоже сбрасываю ошибку с пом Err = 0.



Цитата Сообщение от VladSh
Пришли к тому, что лучше использовать культурный метод для обнуления ошибки On Error Goto 0.
эм... а где написано, что эта конструкция сбрасывает ошибку?.. надо потестить, но вроде как только Resume сбрасывает код ошибки.

вообще, на очень интересный момент ты указал. спасибо
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
02.02.2010, 15:57
Цитата Сообщение от Akupaka
очень интересно, что не срабатывало О.о еще было бы лучше знать наверняка глюк ли это нотеса/домино или в коде недочет...
тоже сбрасываю ошибку с пом Err = 0.
Точно недочёт кода не мог быть! Так и было раньше написано в функции Err = 0, от того столько недоумения и вызывает иногда то, что отказывается работать, что столько лет пропахало без проблем..



Цитата Сообщение от Akupaka
эм... а где написано, что эта конструкция сбрасывает ошибку?.. надо потестить
<!--QuoteBegin-"Help"+-->
<span class="vbquote">("Help")</span><!--QuoteEBegin-->GoTo 0
If errNumber is specified, specifies that when the error occurs, the error should be handled by the most recent general On Error statement that specifies no error number.
If errNumber is omitted, no errors are handled in the current procedure.[/quote]Или здесь: http://web3.inttrust.ru/site/itforum.nsf/4...33;OpenDocument
И чуток ниже там есть "How does On Error work?".
Но эту штуку я первый раз увидел не в хелпе, а на форуме Интертраста несколько лет назад:
http://web3.inttrust.ru/site/itforum.nsf/4...33;OpenDocument



Цитата Сообщение от Akupaka
, но вроде как только Resume сбрасывает код ошибки.
Это верно.
Что советуют, например, здесь: http://web3.inttrust.ru/site/itforum.nsf/4...33;OpenDocument
не работает. Нужно сначала уйти на метку (у меня это Err4091 (отредактировал)), а с неё уже Resume Next, а потом чтобы перед выходом из функции обязательно On Error Goto 0, - тогда всё тип-топ!



Цитата Сообщение от Akupaka
вообще, на очень интересный момент ты указал. спасибо
Не за что; всегда рад ;)
0
0 / 0 / 1
Регистрация: 30.06.2007
Сообщений: 2,153
02.02.2010, 15:58
Цитата Сообщение от ToxaRat
всё дроблю на мелкие функции, которые обязательно возвращают True если доходят до конца
Можешь напомнить, как выглядела твоя GetDocByUNID/аналог или как ты удаляешь файлы с помошью Kill, например?
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
02.02.2010, 16:02
VladSh
проверил, можешь и сам проверить


Code
1
2
3
4
5
6
    On Error Resume next
Error 1000, "Error 1"
On Error GoTo 0
If Err <> 0 Then
MsgBox "Error: " & Error & " = " & CStr(err)
End If
или я не так понял?

Добавлено:


Цитата Сообщение от VladSh
If errNumber is omitted, no errors are handled in the current procedure.
это означает лишь, что все ошибки передаются в вызывающую процедуру, или в стандартный обработчик Notes, если стек вызовов пуст (надеюсь понятно выразился, бо может фраза и не совсем корректна)
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
02.02.2010, 16:03
Akupaka, не, так не будет работать я чуть выше на этом специально остановился.



Цитата Сообщение от Akupaka
Добавлено:
это означает лишь, что все ошибки передаются в вызывающую процедуру, или в стандартный обработчик Notes, если стек вызовов пуст (надеюсь понятно выразился, бо может фраза и не совсем корректна)
В том-то и дело, что у меня при Err = 0 ошибки в некоторых случаях передавались вверх, а после On Error Goto 0 перестали.
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
02.02.2010, 16:09
ага, вероятно, что я таки не так понял


Цитата Сообщение от VladSh
не работает. Нужно сначала уйти на метку (у меня это ErrH), а с неё уже Resume Next, а потом чтобы перед выходом из функции обязательно On Error Goto 0, - тогда всё тип-топ! smile.gif
напиши, пож, свой пример полной обработки кода, чтобы можно было оценить наглядно, а не догадками?


Добавлено:


Цитата Сообщение от VladSh
В том-то и дело, что у меня при Err = 0 ошибки в некоторых случаях передавались вверх
О.О интересно, никогда не встречал, и не слышал
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
02.02.2010, 16:14
Akupaka, дык вот жи он: .

Добавлено:
После

Code
1
2
Err4091:
Resume Next
Err уже = 0 (поэтому я там на Nothyng проверяю), но если не поставить там On Error Goto 0, то в вызывающей проце обработчик в каких-то специфических случаях казал эту ошибку, т.е. On Error Goto 0 обязателен для корректного "подавления"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2010, 16:14
Помогаю со студенческими работами здесь

Имеет ли смысл ставить видеокарту на эту сборку?
Всем привет, я в общем чайник. Есть мезозойский комп: плата GYGabyte GA-G41MT-S2P(775 сокет, оперативка DDR3 1333- 4 Гб, PCIEx16), проц...

Имеет ли смысл ставить доп. охлаждение на видеокарту
Доброго времени суток! Имеется видеокарта Geforce GTX 650, не разогнанная. Установлены последние драйвера. Во время нагрузки греется до 45...

Имеет ли смысл ставить ссылки в 1ps через редирект
А для чего имеет тогда смысл ставить ссылки с редиректом?

Имеет ли смысл ставить gtx 770 на мой компьютер?
Всем привет. Знакомый предложил видеокарту Palit Jetstream GTX770 256bit 2gb. Отсюда вопрос: нормально ли она встанет с моим процессором и...

Имеет ли смысл ставить 1050Ti 4Gb или 1060 3(6)Gb к старенькому i7?
Подскажите пожалуйста, имеет ли смысл присоседить 1050Ti или 1060 3(6)Gb к: Intel Hunter Cove DH55HC QuadCore Intel Core i7-870,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru