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


Автор: msdmsd 15.8.2010, 15:40
Вот пример - в цикле выполняются операции над элементами массива - деление 1 на очередной элемент. Некоторые элементы нули.
Надо чтобы когда попадаются нули выполнялась обработка исключения и цикл был продолжен. В этом примере первое исключение срабатывает как надо, но на следующем нулевом элементе исключение не ловится - бейсик обрабатывает его сам и программа завершает
работу. Попытки переопределить обработку исключений ни к чему не приводят. Как это обойти?

Код

Private Sub Command1_Click()
    Dim a(3) As Integer
    Dim i As Variant
    Dim v As Integer
    
    a(0) = 1
    a(1) = 0
    a(2) = 0
    a(3) = 2
    
    On Error GoTo Err1
    
    For Each i In a
        v = 1 / i
nexti:
    Next
    
    Exit Sub
        
Err1:
    GoTo nexti
End Sub

Автор: Dexx 15.8.2010, 17:35
Почему бы не добавить проверку на 0

Автор: iff 15.8.2010, 20:55
Код

Private Sub Command1_Click()
    Dim a(3) As Integer
    Dim i As Variant
    
    a(0) = 1
    a(1) = 0
    a(2) = 0
    a(3) = 2
    
    On Error GoTo Err1
    
    For Each i In a
        If a(i) <> 0 Then a(i) = 1 / i
    Next
    
    Exit Sub

Автор: Akina 15.8.2010, 21:54
Обработчик исключений следует завершать не Goto, а Resume. В крайнем случае (нежелательно!) использовать Err.Clear

Автор: msdmsd 16.8.2010, 10:15
если вместо Goto написать Resume - то данный пример просто зависнет - после обработки будет возврат к той же строке и снова исключение.
Можно написать Resume Next - тогда для этого примера будет все как надо, но что делать если требуется следующее:
(есть ли вариант решения без использования каких то дополнительных флажков и т.п.)
Код

Private Sub Command1_Click()
    Dim a(3) As Integer
    Dim i As Variant
    Dim v As Integer
    
    a(0) = 1
    a(1) = 0
    a(2) = 0
    a(3) = 2
    
    On Error GoTo Err1
    
    For Each i In a
        v = 1 / i
        ... еще какие то строки, которые надо пропустить в случае исключения (должен быть переход при возникновении исключении к nexti)
nexti:
    Next
    
    Exit Sub
        
Err1:
    GoTo nexti
End Sub

Автор: Akina 16.8.2010, 10:28
Цитата(msdmsd @  16.8.2010,  11:15 Найти цитируемый пост)
если вместо Goto написать Resume - то данный пример просто зависнет - после обработки будет возврат к той же строке и снова исключение.

А сделать Resume на другую строку или просто On Error Resume Next религия не позволяет? или простое нежелание читать справку?
Код

Err1:
    Resume nexti

Я уж не говорю о том, что ПЕРЕД делением можно проверить операнд.

Автор: msdmsd 16.8.2010, 10:45
спасибо, за ответ, только мне непонятна реакция.
зачем вообще форум, если все можно где-то прочитать, а про проверку на 0 я полагал, что это очевидно, пример то искусственный, вопрос то был про исключения.


Автор: Akina 16.8.2010, 12:10
Цитата(msdmsd @  16.8.2010,  11:45 Найти цитируемый пост)
зачем вообще форум, если все можно где-то прочитать

Форум - для решения вопросов, которые не удалось решить самостоятельно. 
Но если не удалось потому, что лень нажать F1 и прочитать десять строк справки... какой реакции на ЭТО ты ожидаешь?

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