Форум программистов, компьютерный форум, киберфорум
Наши страницы

VBA

Войти
Регистрация
Восстановить пароль
 
Vhodnoylogin
-13 / 2 / 0
Регистрация: 02.04.2012
Сообщений: 299
#1

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

20.04.2017, 11:48. Просмотров 147. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка проскакивает обработччик ошибок (VBA):

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

проскакивает условие - C (Си)
// задание 4 4 дополнительная.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <stdlib.h> ...

Проскакивает getline - C++
Программа игнорирует первый ввод. Client obj; cout << "Name: "; getline(cin, obj.Name); cout << '\n'; cout << "Last...

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

Проскакивает звук и видео - Windows XP
проблема в следующем. при проигрывание аудио и видео файлов проскакивает звук (и видео если видео файл) незначительно на секунду может...

Проскакивает чтение с клавиатуры - C++
Здравствуйте! Подскажите. Почему вконце (на cin.get(s,100);) приложение просто проскакивает ввод с клавиатуры. Просто не ждет ввода, а...

4
SoftIce
comment ca va
10404 / 3903 / 998
Регистрация: 27.07.2011
Сообщений: 9,449
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

Компилятор проскакивает инструкцию - C++
#include "stdafx.h" #include <conio.h> #include <iostream> #include "Person_Name.h" int _tmain(int argc, _TCHAR* argv) { ...

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

Почему проскакивает строка ввода FIO? - C++
class Employee { public: Employee() {}; ~Employee() {}; void Add_data(); // добавить данные void Show_data();...

Программа проскакивает с ошибкой. Одномерный массив - C++
В функции сортировки переменные выходят за предельные рамки И программа завершается с кодом 0 В одномерном массиве, состоящем из n...


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

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

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