On Error

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

On Error

Сообщение Киска » 29.01.2007 (Пн) 1:20

Почему у меня не получается обработать ошибку?

On Error GoTo 20
For i = 0 To 1
a = i / 0
...
20 Next

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

Сообщение tyomitch » 29.01.2007 (Пн) 1:29

Потому что.
20 If Err Then Resume 30
30 Next
Изображение

Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Сообщение Киска » 29.01.2007 (Пн) 2:11

а почему мой вариант не работает?

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

Сообщение tyomitch » 29.01.2007 (Пн) 2:26

Потому что ошибки внутри обработчика ошибок не обрабатываются.
Изображение

Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Сообщение Киска » 29.01.2007 (Пн) 3:00

что значит - внутри обработчика ошибок не обрабатываются? А где же ошибки должны обрабатываться? А я и не обрабатываю ошибку, просто делаю переход в случае ошибки и всё. Что-то ничего не пойму :(

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

Сообщение tyomitch » 29.01.2007 (Пн) 3:13

Внутри обработчика ошибок не обрабатываются вновь возникшие ошибки. Так понятнее?
Выход из обработчика ошибок -- командой Resume.
Изображение

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 29.01.2007 (Пн) 3:22

Код: Выделить всё
On Error GoTo 20
For i = 0 To 1
    a = i / 0
    ...
20  Resume Next
Next

или так
Код: Выделить всё
10  On Error GoTo 40
20  For i = 0 To 1
30      a = i / 0
         ...
40      Resume 50
50  Next

а правильно так
Код: Выделить всё
    On Error GoTo hErr
    For i = 0 To 1
        a = i / 0
        ...
        GoTo doNext
hErr:
        Resume doNext
doNext:
    Next
Последний раз редактировалось skiperski 29.01.2007 (Пн) 3:31, всего редактировалось 1 раз.

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

Сообщение tyomitch » 29.01.2007 (Пн) 3:31

skiperski, так тоже нельзя. Будет ошибка №20, если к моменту вызова Resume ошибки не было.

Правильный код уже указан в первом ответе.
Изображение

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 29.01.2007 (Пн) 3:33

tyomitch писал(а):skiperski, так тоже нельзя. Будет ошибка №20, если к моменту вызова Resume ошибки не было.


Ошибка будет, но она сама на свой обработчик и прыгнет. И после повтора строки с Resume продолжит выполнение. Это не красиво, но работает.

Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Сообщение Киска » 29.01.2007 (Пн) 3:35

что это за обработчик ошибок такой? Где он находится? Я просто говорю - в случае ошибки продолжить выполнение со строки 20... Что ещё за обработчик ошибки - непонятно.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 29.01.2007 (Пн) 3:43

В твоём случае проще сделать как tyomitch советует
Код: Выделить всё
    On Error GoTo 20
    For i = 0 To 1
        a = i / i
        ...
20      If (Err) Then Resume 30
30  Next

А обработчик ошибки -- это код выполняющийся после возникновения ошибки и принимающий решение, что делать дальше. В твоём случае это строка с меткой 20.

zan
Бывалый
Бывалый
 
Сообщения: 224
Зарегистрирован: 24.08.2006 (Чт) 4:55

Сообщение zan » 29.01.2007 (Пн) 4:17

А не проще вообще ошибку в данном случае не обрабатывать (об этом же не писали)...
Код: Выделить всё
On Error Resume Next
For i = 0 To 1
    a = i / i
    ....
Next i

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

Сообщение tyomitch » 29.01.2007 (Пн) 5:19

Писал skiperski в своём первом примере. У него там как раз замаскированный On Error Resume Next.
Изображение

Киска
Новичок
Новичок
Аватара пользователя
 
Сообщения: 39
Зарегистрирован: 23.11.2006 (Чт) 1:43

Сообщение Киска » 30.01.2007 (Вт) 3:15

значит, я так понимаю, мы входим в обработчик ошибки, из которого надо обязательно выйти, используя Resume. А почему не допускается сразу написать On Error Resume 20 - т.е. начать выполнение со строки 20, выйдя из обработчика (или даже не входя :))?

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

Сообщение tyomitch » 30.01.2007 (Вт) 4:22

Напиши Биллу жалобу, что не предусмотрел.
Изображение


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

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

Сейчас этот форум просматривают: Google-бот, The trick и гости: 2

    TopList