Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Vhodnoylogin
-13 / 2 / 0
Регистрация: 02.04.2012
Сообщений: 299
#1

Ошибка проскакивает обработччик ошибок

20.04.2017, 11:48. Просмотров 154. Ответов 4
Метки нет (Все метки)

Добрый день.

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

Структура кода такая:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function f1(){
    on error goto errHandler1
    function f2(){
        on error goto errHandler2
        for i = 1 to 5
            function f3(){
                err.raise -1
            }
        itLabel: next i
        errHandler2:
            err.clear
            goto itLabel
    }
    errHandler1:
}
Функция 3 возвращает результат, либо ошибку. В случае ошибки итерация в цикле должна пропускаться. Чем и занимается обработчик Хендлер2.

Проблема в том, что он это делает один раз. То есть первый раз при возврате ошибки программа переходит в обработчик Хендлер2. Но на второй ошибке - программа улетает сразу в Хендлер1.
Это видно при пошаговом дебаженьи кода - сразу после Райза программа прыгает на Хендлер1.


Пожалуйста, помогите разобраться с проблемой.

Добавлено через 1 час 56 минут
Все, разобрался...

Дело в том, что Err.Clear НЕ РАБОТАЕТ. Нужно писать Resume itLabel - тогда ошибка очищается.
Ну что за язык?..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2017, 11:48
Ответы с готовыми решениями:

Ошибка в обработчике ошибок
Люди, здравствуйте. Если написать "On Error GoTo label", то при ошибке...

Выполнить условие после нахождения ошибок в строке типа #н/д! #дел/0! т.д. (ошибка в макросе)
Здравствуйте уважаемые форумчане! Помогите найти ошибку в коде макроса и...

Проскакивает getline
Программа игнорирует первый ввод. Client obj; cout << "Name: ";...

проскакивает условие
// задание 4 4 дополнительная.cpp: определяет точку входа для консольного...

Цикл While проскакивает ограничения
using System; using System.Collections.Generic; using System.Linq; using...

4
SoftIce
comment ca va
10446 / 3954 / 1009
Регистрация: 27.07.2011
Сообщений: 9,556
Завершенные тесты: 1
20.04.2017, 11:51 #2
Цитата Сообщение от Vhodnoylogin Посмотреть сообщение
Err.Clear НЕ РАБОТАЕТ
А on error goto 0 ?

Отключает любой включенный обработчик ошибок в текущей процедуре.
0
Vhodnoylogin
-13 / 2 / 0
Регистрация: 02.04.2012
Сообщений: 299
20.04.2017, 12:04  [ТС] #3
SoftIce, что?
Мне не нужно "готу ноль".

Вот. Два кода, один работает как надо, другой - падает.
Падает:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Option Explicit
 
Public Const ERR_NUMBER As Integer = 5000
 
Public Sub s1()
    On Error GoTo errLabelS1
     
    s2
    Exit Sub
errLabelS1:
    Debug.Print "In s1"
End Sub
 
Public Sub s2()
    On Error GoTo errLabelS2
     
    Dim i As Integer
     
    For i = 1 To 5
        On Error GoTo errLabelS2
        Debug.Print i & " " & f3(i)
        On Error GoTo errLabelS2
itLabel:
    Next i
     
    Exit Sub
errLabelS2:
    If Err.Number = ERR_NUMBER Then
        Err.Clear
        GoTo itLabel
    End If
    Debug.Print "In s2"
End Sub
 
Public Function f3(i As Integer) As Integer
    If i Mod 2 = 0 Then
        Err.Raise ERR_NUMBER
    Else
        f3 = i * i
    End If
End Function


Работает:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Option Explicit
 
Public Const ERR_NUMBER As Integer = 5000
 
Public Sub s1()
    On Error GoTo errLabelS1
     
    s2
    Exit Sub
errLabelS1:
    Debug.Print "In s1"
End Sub
 
Public Sub s2()
    On Error GoTo errLabelS2
     
    Dim i As Integer
     
    For i = 1 To 5
        On Error GoTo errLabelS2
        Debug.Print i & " " & f3(i)
        On Error GoTo errLabelS2
itLabel:
    Next i
     
    Exit Sub
errLabelS2:
    If Err.Number = ERR_NUMBER Then
        Resume itLabel
    End If
    Debug.Print "In s2"
End Sub
 
Public Function f3(i As Integer) As Integer
    If i Mod 2 = 0 Then
        Err.Raise ERR_NUMBER
    Else
        f3 = i * i
    End If
End Function



Отличия только в
Err.Clear: GoTo itLabel
0
SoftIce
20.04.2017, 12:11
  #4

Не по теме:

Извиняюсь, удалил. Перепутал раздел.

0
Vhodnoylogin
-13 / 2 / 0
Регистрация: 02.04.2012
Сообщений: 299
20.04.2017, 13:52  [ТС] #5
Кстати, вопрос не снимается...
Конечно, программа теперь работает как надо... Однако сама причина ошибки мне непонятна: ведь ошибка возникала в третьей функции - следовательно, поймать ошибку должен обработчик ВТОРОГО саба, а не первого... Почему ошибка прокидывается через один саб?
0
20.04.2017, 13:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2017, 13:52

Проскакивает звук и видео
проблема в следующем. при проигрывание аудио и видео файлов проскакивает звук...

Проскакивает добавление из формы
Есть форма добавления задач, при клике на кнопку данные уходят аяксом в файл...

Не выполняется (проскакивает) оператор
Здравствуйте! Я новичок в С. Простите за наиглупейший вопрос, но почему так? В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru