On Error работает только 1 раз

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Niko
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 102
Зарегистрирован: 16.03.2006 (Чт) 14:43

On Error работает только 1 раз

Сообщение Niko » 28.03.2006 (Вт) 13:27

NumFile=0
1:
On Error GoTo 1
NumFile = NumFile + 1
NameFile = ShifrO & "-" & NumFile
fso.MoveFile cDlg.FileName, PathTmp & "\" & NameFile

Мне нужно переименовать файл. Новое имя состоит из строки и номера. Я не знаю есть ли файлы с такими же номерами. В данном примере если есть файл ХХХ-1 то фокус передается на метку и создается файл ХХХ-2. Но если есть файли и ХХХ-1 и ХХХ-2, то выдается ошибка №58 "File already exsists", т.е. в случае ошибки GoTo 1 срабатывает только 1 раз.

Подскажите плиз, что тут можно сделать.

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 28.03.2006 (Вт) 13:50

Код: Выделить всё
NumFile=0 1: On Error GoTo 1 NumFile = NumFile + 1 NameFile = ShifrO & "-" & NumFile fso.MoveFile cDlg.FileName, PathTmp & "\" & NameFile


Начнем с того, что GoTo так просто использовать просто не принято. Не говорю уж о том, что это неприлично и неправильно.

Код: Выделить всё
NumFile=0
On Error GoTo 1
NumFile = NumFile + 1
NameFile = ShifrO & "-" & NumFile
If fso.FileExists(PathTmp & "\" & NameFile) Then
    Err.Rase 58
Else
    fso.MoveFile cDlg.FileName, PathTmp & "\" & NameFile
End If

Exit Sub (Function или чт там у тебя)
1:
If Err.Number=58 then MsgBox "Error #58" & vbCrLf & "File " & NameFile & " already exists."


Если я правильно понял, что тебе надо.

А вместо FSO.MoveFile лучше использовать MoveFileEx (апишная фушка). Она помощнее и побыстрее будет.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 28.03.2006 (Вт) 13:58

После обработки ошибки надо вернуть управление основной программе, Resume. Но лучше, конечно, в консерватории подправить, ошибки не так обрабатываются.
Lasciate ogni speranza, voi ch'entrate.

Tamplier
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 183
Зарегистрирован: 18.11.2005 (Пт) 13:35
Откуда: Москва

Сообщение Tamplier » 28.03.2006 (Вт) 14:06

Ты имеешь ввиду
Код: Выделить всё
1:
If Err.Number=58 then MsgBox "Error #58" & vbCrLf & "File " & NameFile & " already exists."
Resume Next
?
Ну это естественно. Просто, непонятно, есть ли тм что либо еще или нет....

ошибки не так обрабатываются.

Не так. Но это самый простой способ. ИМХО. (да к тому же я других не знаю :D Не подскажешь, где есть про обработку ошибок? Тока не посылай в поиск. Потом схожу. Интересно для начала услышать мнение живого человека.)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.03.2006 (Вт) 14:06

После того, как происходит переход на метку 1: в результате ошибки, эта метка считается обработчиком ошибок, а если ошибка произошла в обработчике, выполнение возвращается в обработчик более высокого уровня (если есть), т.е. в процедуру, вызвавщую текущую. И т. д. пока не наткнется на обработчик или не вылетит в винды с необработанной ошибкой.

В твоем случае лучше сделать так:
Код: Выделить всё
on error resume next
NumFile=0
err.raise 123
while err.number<>0
    err.clear
    NumFile = NumFile + 1
    NameFile = ShifrO & "-" & NumFile
    fso.MoveFile cDlg.FileName, PathTmp & "\" & NameFile
wend
Или так:
Код: Выделить всё
    on error goto 1:
    NumFile=0
tryagain:
    NumFile = NumFile + 1
    NameFile = ShifrO & "-" & NumFile
    fso.MoveFile cDlg.FileName, PathTmp & "\" & NameFile
    exit sub
1:
    resume tryagain
Первый способ обработки ошибок называется Inline error handling, второй - Outline error handling.
Tamplier, это тебе ключевые слова :wink:
Хотя того, что я рассказал, должно хватить для понимания принцыпа обработки ошибок.
Лучший способ понять что-то самому — объяснить это другому.

Niko
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 102
Зарегистрирован: 16.03.2006 (Чт) 14:43

Сообщение Niko » 28.03.2006 (Вт) 14:49

Спасибо, все понял.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.03.2006 (Вт) 16:15

alibek писал(а):После обработки ошибки надо вернуть управление основной программе, Resume. Но лучше, конечно, в консерватории подправить, ошибки не так обрабатываются.

Альтернативный (полудокументированный) способ -- On Error GoTo -1
Изображение

Roman-vb
Обычный пользователь
Обычный пользователь
 
Сообщения: 91
Зарегистрирован: 24.01.2006 (Вт) 18:31
Откуда: БРЯНСК

Сообщение Roman-vb » 28.03.2006 (Вт) 16:31

Конечно, On Error GoTo - хорошо(хотя многие хают), но сейчас же (в 21-м веке) есть
Код: Выделить всё
Try

Catch ex As Exception

End Try

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 28.03.2006 (Вт) 16:32

У нас же VB6 :)

Roman-vb
Обычный пользователь
Обычный пользователь
 
Сообщения: 91
Зарегистрирован: 24.01.2006 (Вт) 18:31
Откуда: БРЯНСК

Сообщение Roman-vb » 28.03.2006 (Вт) 16:43

Amed писал(а):У нас же VB6 :)

А, ну да. Сам с ним расстаться не могу

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 28.03.2006 (Вт) 19:22

А вручную устроить SEH никак? Народ ведь на асме как-то ошибки обрабатывает...
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 03.04.2006 (Пн) 11:02

Я конечно многого не понимаю, но похоже, что это как-то можно приспособить... Или нет?
Вложения
seh3.rar
(1.07 Кб) Скачиваний: 29
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.04.2006 (Пн) 15:22

1. Проблемы никакой нет. Сабж решается использованием Resume либо On Error GoTo -1. Ничего нового изобретать не нужно.

2. Механизм обработки ошибок в VB построен как раз на SEH. Так что конкретно SEH по второму разу приспособить не удастся.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 173

    TopList