Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: On Error GoTo и циклы Добавлено: 26.07.07 20:29  

Автор вопроса:  Viktor Petrov
Возникла такая проблема - необходимо внутри цикла обрабатывать ошибку, которая может повторяться на протяжении нескольких витков. Однако ошибка корректно обрабатывается лишь в первый раз, а на следующем витке уже вылезает сообщение об ошибке. Например, данный код выдаст ошибку (несовпадение типов) на втором витке:

Private Sub Command1_Click()
Dim FRT As Single


For t = 1 To 3

On Error GoTo 1
FRT = "ggg"
1:

Next


End Sub


Как же избежать этих "граблей"?

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #1 Добавлено: 26.07.07 20:57

1:
If Err Then
    Err.Clear
    Resume Next
End If

Ответить

Номер ответа: 2
Автор ответа:
 Viktor Petrov



Вопросов: 12
Ответов: 27
 Профиль | | #2 Добавлено: 26.07.07 20:59
Огромное спасибо.

Ответить

Номер ответа: 3
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #3
Добавлено: 26.07.07 21:10
Ошибк возникает вот почему:
http://msdn2.microsoft.com/en-us/library/5hsw66as(vs.71).aspx

If an error occurs while an error handler is active (between the occurrence of the error and a Resume, Exit Sub, Exit Function, or Exit Property statement), the current procedure's error handler can't handle the error. Control returns to the calling procedure. If the calling procedure has an enabled error handler, it is activated to handle the error. If the calling procedure's error handler is also active, control passes back through previous calling procedures until an enabled, but inactive, error handler is found. If no such error handler is found, the error is fatal at the point at which it actually occurred.


существует два варианта обработки ошибок:

On Error GoTo 0 disables error handling in the current procedure. It doesn't specify line 0 as the start of the error-handling code, even if the procedure contains a line numbered 0. Without an On Error GoTo 0 statement, an error handler is automatically disabled when a procedure is exited.

On Error GoTo -1 disables the exception in the current procedure. It doesn't specify line -1 as the start of the error-handling code, even if the procedure contains a line numbered -1. Without an On Error GoTo -1 statement, an exception is automatically disabled when a procedure is exited.
по умолчанию всегда стоит 0 и обрабатывается манипулятор ошибки, до 1-ой ошибки или выхода из процедуры, а не исключения

делай так:

Private Sub Command1_Click()
Dim FRT As Single

Dim t As Integer

For t = 1 To 3
    On Error GoTo -1
    On Error GoTo 1
FRT = "ggg"
1:

Next


End Sub


Все вышесказанное, включая код, я сделал для того, чтобы ты понял, почему возникает ошибка, но ни в как не пример того, как надо делать.

Ответить

Номер ответа: 4
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #4
Добавлено: 26.07.07 21:11
2EUGY, ты как-то сложно замутил, разве не проще просто так?


Private Sub Command1_Click()
Dim FRT As Single

Dim t As Integer

For t = 1 To 3
On Error Resume Next
FRT = "ggg"
1:

Next

End Sub

Ответить

Номер ответа: 5
Автор ответа:
 Viktor Petrov



Вопросов: 12
Ответов: 27
 Профиль | | #5 Добавлено: 26.07.07 21:19
2-АлександР-
Не, Resume Next, к сожалению, не пойдет. Этот кусок кода я привел лишь для демонстрации проблемы - в реальном приложении в случае возникновения ошибки приходится выполнять определенные действия, поэтому без GoTo не обойтись.

Ответить

Номер ответа: 6
Автор ответа:
 EUGY



Вопросов: 0
Ответов: 454
 Профиль | | #6 Добавлено: 26.07.07 21:25
Меня вообще тошнит от любого On Error в циклах.

Ответить

Номер ответа: 7
Автор ответа:
 Viktor Petrov



Вопросов: 12
Ответов: 27
 Профиль | | #7 Добавлено: 26.07.07 21:36
2EUGY
Понимаю, я, в-общем, про это же в соседней теме и писал. Надеюсь, что благодаря вашему там совету, удастся в итоге обойтись без этого...

Ответить

Номер ответа: 8
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #8 Добавлено: 26.07.07 21:55
1. Обдумай как недопустить ошибки. Например проверяй типы переменных перед присваиванием. (IsNumeric etc)
2.
Private Sub Command1_Click()
Dim FRT As Single
On Error Resume Next

   For t = 1 To 3
       FRT = "ggg"
   Next

End Sub

или
Private Sub Command1_Click()
Dim FRT As Single
On Error Goto ErrProc

   For t = 1 To 3
       FRT = "ggg"
   Next
   Exit Sub
ErrProc:
        MsgBox "ошибочка"
        Resume Next
End Sub

Ответить

Номер ответа: 9
Автор ответа:
 astoro



ICQ: 649109 

Вопросов: 31
Ответов: 391
 Профиль | | #9 Добавлено: 27.07.07 06:28
Обдумай как недопустить ошибки


Вот ключевая фраза.

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

Ответить

Номер ответа: 10
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #10
Добавлено: 27.07.07 08:32
Если юзать On Error GoTo, то в ерроре Resume Next означает, что прога должна идти дальше с того места, где была ошибка, а просто Resume - прога должна повторить место где была ошибка и идти дальше. Это я так, на заметочку.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам