Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > "on error" глючит или я не понял?


Автор: Сувор 17.7.2004, 19:55
1. Запускаю код для VB 6.0:

Sub form_load(): CommonDialog1.CancelError = True:
On Error GoTo 100: CommonDialog1.ShowOpen:
100 On Error GoTo 200: CommonDialog1.ShowOpen:
200 End Sub

После первого клика на Cancel улетаем на 100 как и ожидаем,
а после второго получаем таки сообщение об ошибке! ------- Не понял!?


Автор: cardinal 17.7.2004, 22:09
Кто же так пишет? Это же невозможно читать. baaa.gif
Код
Sub form_load()
CommonDialog1.CancelError = True
On Error GoTo 100
CommonDialog1.ShowOpen
100:
On Error GoTo 200
CommonDialog1.ShowOpen
200:
End Sub

А вот почему не работает я пока сам не понял.

Автор: boevik 18.7.2004, 07:43
CommonDialog1.CancelError = True 'при нажатии на Cancel выбросит ошибку

Нажал Cancel (т.е. выброс ошибки), происходит переход на метку 100.

Когда во второй раз нажимается Cancel, возникает вторая ошибка в той же процедуре.
При возникновении второй ошибки в той же процедуре, обработка ошибки передается на верхний уровень.
Так как выше уровня нет, то VB выбрасывает ошибку.

Это объяснение.
Сувор, мне не понятно, что ты хотел сделать в этом коде. Объясни подробнее.

Автор: Naghual 18.7.2004, 21:07
Фишка в том, что у тебя нет обработки ошибки как таковой. Тоесть количество ошибок в коллекции Err больше 1 (Err.Count > 1).
Плюс, как уже сказал боевик, повторное событие возникает в той-же процедуре.
Необходимо правильно назначать точки входа и выхода для событий Ошибок!

Код

Sub form_load()
  CommonDialog1.CancelError = True
  On Error GoTo 100
  CommonDialog1.ShowOpen
100:
  On Error GoTo 200
  CommonDialog1.ShowOpen
  'Вот тут добавляеш:
  Err.Resume Next  'Или Err.Resume 200:
200:
  'Вот тут добавляеш:
  Err.Resume Next
End Sub

Автор: Сувор 26.7.2004, 22:01
Что хотел? -Ну это конечно выжимка из моего кода. А хотел я открыть несколько файлов, но некоторых может не быть, но это не смертельно. Ну грузить этим всем юзера по-моему негуманно, я просто предлагаю ему открывать и рассчитываю что при наличии отсутствия он может кликнуть отмену а я распознаю да и пропущу. И тут вдруг такие заморочки! Но попробую как сказали! Thank you very very much!

Автор: cardinal 27.7.2004, 08:22
Блин, хотел тут пару строчек чиркануть и забыл...

Naghual
Код
Sub form_load()
 CommonDialog1.CancelError = True
 On Error GoTo 100
 CommonDialog1.ShowOpen
100:
 On Error GoTo 200
 CommonDialog1.ShowOpen
 'Вот тут добавляеш:
 Err.Resume Next  'Или Err.Resume 200:
200:
 'Вот тут добавляеш:
 Err.Resume Next
End Sub

Err.Resume Next, в последней строке как я понял можно и не писать, т.к. при выходе из процедуры Err должен сам обнулиться.
А вообще у меня нет Err.Resume, a есть только Rеsume... smile.gif
Цитата
И тут вдруг такие заморочки!

Да в принципе никаких особых проблем здесь я не вижу. Главное после обработки ошибки написать Resume (что не советуют), Resume Next или Resume "label".

Автор: Naghual 28.7.2004, 13:04
cardinal
Цитата
Err.Resume Next, в последней строке как я понял можно и не писать, т.к. при выходе из процедуры Err должен сам обнулиться.


Это не совсем верно.
Если форма запускается програмой автоматически (StartUp object: Form), то тогда да.
Но если форма, которая содержит эту процедуру была вызвана програмно, да еще и в родительской процедуре установлен перехватчик ошибок, то это событие об ошибке к ней и перенесется! Тоесть, сработает перехват ошибки на строке Form.Show или подобной.

Поправье если я не прав


Автор: boevik 28.7.2004, 13:10
Naghual, прав на 100%.

Автор: cardinal 28.7.2004, 21:23
Понял smile.gif, надо будет это в FAQ дописать...

Автор: Сувор 29.7.2004, 21:25
Нет счастья! Err.Resume Next мой VB 6.0 вообще не сьел -просит вместо Next
выражение, а когда я поставил просто Resume Next, то с обработкой Отмены все
вроде прошло, но вот когда я шлепнул "Открыть" (при наличии отсутствия нужного файла) то бедняга впал в такой ступор, что в натуре пришлось питание вырубать! (и если поставить CommonDialog.Flags на &H1000 то все равно также)
Ну да бог с ним -загружу этим юзера пусть сам открывает

Автор: Naghual 29.7.2004, 22:09
wink.gif
Ок. Это он у тебя на последний ругается. Ну и правильно. Мы говорим ему - сбросить ошибку и перейти к следующей строке. Только вот строки следующей НЕТ. Есть конец процедуры.
Нужно добавить строку. К примеру такую:
Код
   Err.Resume Next
   DoEvents
End Sub


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)