Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / try catch в VBA / 25 сообщений из 34, страница 1 из 2
09.07.2007, 08:55
    #34646480
Самурай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
В С++ есть такая тема, как локальный отлов ошибок (try {...} catch (...) {...})

Есть ли такая же возможность в VBA? Мне нужно отловить возможную ошибку в небольшой части кода. Если ошибка обнаружена, то надо выполнить определённые действия, после чего продолжить выполнение кода, расположенного после ошибочного куска.

Это как-нибудь можно сделать?
_____________________________
Использую Access 2003, mdb
...
Рейтинг: 0 / 0
09.07.2007, 09:02
    #34646489
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
On Error
...
Рейтинг: 0 / 0
09.07.2007, 10:24
    #34646602
Самурай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
авторOn Error

А можно привести пример кода? Так чтобы ошибка искалась только в определённом участке кода, и нигде больше.
_____________________________
Использую Access 2003, mdb
...
Рейтинг: 0 / 0
09.07.2007, 10:34
    #34646640
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
код.............
код.............
On Error Goto Метка
код с проверкой
код с проверкой
Метка:
Обработка ошибки
...
Рейтинг: 0 / 0
09.07.2007, 10:56
    #34646716
Самурай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
А что произойдёт, если ошибки не будет? Он же просто пройдёт участок кода
Код: plaintext
1.
код с проверкой
код с проверкой
, дойдёт до метки Метка:, после чего выполнит все инструкции по обработке ошибок (т.е. в моём случае выдаст сообщение, даже если ошибки не было)...



_____________________________
Использую Access 2003, mdb
...
Рейтинг: 0 / 0
09.07.2007, 11:14
    #34646787
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Это же не рабочий код. Конечно, существуют обходы, типа Goto, Exit Sub и т.д.
...
Рейтинг: 0 / 0
09.07.2007, 11:41
    #34646878
Самурай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Код: plaintext
Это же не рабочий код. 

Так вот я и просил пример РАБОЧЕГО кода, который бы мог подойти в моей ситуации...;-)))
...
Рейтинг: 0 / 0
09.07.2007, 11:51
    #34646909
Karfaqen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Function test()
On Error GoTo err1
    Dim i&
    If MsgBox("Делим на ноль?",  32  + vbYesNo) = vbYes Then i =  1  /  0 
    MsgBox "Выходим по-хорошему",  64 
    Exit Function
err1:
    MsgBox Error,  16 , "ОМАШКА"
    Exit Function
End Function
...
Рейтинг: 0 / 0
09.07.2007, 11:52
    #34646914
ч
ч
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
зоздай на форме кнопку при помощи мастера и у тебя будет код
...
Рейтинг: 0 / 0
09.07.2007, 11:56
    #34646939
ЛП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Karfaqen
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Function test()
On Error GoTo err1
    Dim i&
    If MsgBox("Делим на ноль?", 32 + vbYesNo) = vbYes Then i = 1 / 0
    MsgBox "Выходим по-хорошему", 64
    Exit Function
err1:
    MsgBox Error, 16, "ОМАШКА"
    Exit Function
End Function

ужоснах
над строкой "32 + vbYesNo" - плакаль...
:)
...
Рейтинг: 0 / 0
09.07.2007, 12:12
    #34647011
Самурай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Ладно, приведу кусок моего кода, чтобы было понятно, чего же я хочу...


Код: plaintext
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.
On Error GoTo ErrorHandler

    'Исполняем введённый запрос для проверки его корректности
    Dim TmpRS As DAO.Recordset
    Set TmpRS = CurrentDb.OpenRecordset(Me![SelectQuery].Value)
    TmpRS.Close
    Set TmpRS = Nothing   

    
   'Проверка на повторяющиеся названия в рамках одной подгруппы
   'если добавляется новая запись, то проверяются все узлы на текущем уровне вложенности
   'если редактируется старая запись, то проверяются все узлы на текущем уровне вложенности, кроме него самого
    Dim i As Integer
    For i =  2  To RequeryObject.Nodes.Count 'просматриваем все узлы, кроме корневого
        If (Me.NewRecord And RequeryObject.Nodes(i).Text = Me![Name].Value And RequeryObject.Nodes(i).Parent.Key = RequeryObject.Nodes(RequeryObject.SelectedItem.Index).Key) _
        Or (Not Me.NewRecord And i <> RequeryObject.SelectedItem.Index And RequeryObject.Nodes(i).Text = Me![Name].Value) Then
            MsgBox "В текущей подгруппе уже имеется запись с таким названием!", vbCritical, "Ошибка заполнения"
            Exit Sub
        End If
    Next i

    DoCmd.Close acForm, Form.Name  'закрытие формы
    
ExitFunction:
    Exit Sub
    
ErrorHandler:
    MsgBox "Ошибка во введённом SELECT-запросе: """ & Err.Description & """", vbCritical, "Ошибка"
    Resume ExitFunction
    
End Sub


Так вот... Мне нужно, чтобы сообщение

Код: plaintext
MsgBox "Ошибка во введённом SELECT-запросе: """ & Err.Description & """", vbCritical, "Ошибка"

появлялось только в том случае, если ошибка возникла ТОЛЬКО в куске кода

Код: plaintext
1.
    Dim TmpRS As DAO.Recordset
    Set TmpRS = CurrentDb.OpenRecordset(Me![SelectQuery].Value)

Потому что, если какая-нибудь ошибка возникнет здесь:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   'Проверка на повторяющиеся названия в рамках одной подгруппы
   'если добавляется новая запись, то проверяются все узлы на текущем уровне вложенности
   'если редактируется старая запись, то проверяются все узлы на текущем уровне вложенности, кроме него самого
    Dim i As Integer
    For i =  2  To RequeryObject.Nodes.Count 'просматриваем все узлы, кроме корневого
        If (Me.NewRecord And RequeryObject.Nodes(i).Text = Me![Name].Value And RequeryObject.Nodes(i).Parent.Key = RequeryObject.Nodes(RequeryObject.SelectedItem.Index).Key) _
        Or (Not Me.NewRecord And i <> RequeryObject.SelectedItem.Index And RequeryObject.Nodes(i).Text = Me![Name].Value) Then
            MsgBox "В текущей подгруппе уже имеется запись с таким названием!", vbCritical, "Ошибка заполнения"
            Exit Sub
        End If
    Next i

    DoCmd.Close acForm, Form.Name  'закрытие формы

тогда её уже нельзя будет назвать "Ошибка SELECT-запроса"!
...
Рейтинг: 0 / 0
09.07.2007, 12:19
    #34647044
ЛП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
2 Самурай
Скажите, а какая в Японии официальная религия?
В смысле - она что, запрещает читать хелп?
...
Рейтинг: 0 / 0
09.07.2007, 12:51
    #34647194
Самурай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Код: plaintext
1.
Скажите, а какая в Японии официальная религия?
В смысле - она что, запрещает читать хелп?

Хэлп-то она читать не запрещает!)))))

Просто в хэлпе по этому поводу ничего толкового я не смог найти.

Даже если пробую проверять таким образом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
On Error GoTo ErrorHandler

    'Исполняем введённый запрос для проверки его корректности
    Dim TmpRS As DAO.Recordset
    Set TmpRS = CurrentDb.OpenRecordset(Me![SelectQuery].Value)

ErrorHandler:
    
    If Error() <> "" Then 'если возникла ошибка
        MsgBox "Ошибка во введённом SELECT-запросе: """ & Err.Description & """", vbCritical, "Ошибка"
        Set TmpRS = Nothing
        Exit Sub
    End If
    
    Dim d As Integer
    d =  1  /  0 


ТО мне выдаётся сообщение "Ошибка во введённом SELECT-запросе: Division by zero", хотя деление на 0 было инициировано ПОСЛЕ проверки корректности запроса!
_____________________________
Использую Access 2003, mdb
...
Рейтинг: 0 / 0
09.07.2007, 12:59
    #34647234
Drunechka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
on error goto Errhandler
...
'тра-та-та
...
on error goto Errhandler2
...
'бла-бла-бла
exit sub

ErrHandler:
'сработало на тра-та-та
resume next
ErrHandler2:
'сработало на бла-бла-бла
resume next
+ - + - + - + - + - + - +
Век живи, век учись!
...
Рейтинг: 0 / 0
09.07.2007, 13:00
    #34647244
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Можно понаставить столько разных переходов на РАЗНЫЕ обработчики, сколько вам нужно.

Код: plaintext
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.
On Error goto Err_DataRead
...
...
On Error goto Err_DataCalculate
...
...
On Error goto Err_DataSave
...
...

Exit Function

Err_DataRead:
...
...
Resume туда

Err_DataCalculate:
...
...
Resume куда-то еще

Err_DataSave:
...
...
Resume куда-то в другое место
...
Рейтинг: 0 / 0
09.07.2007, 13:12
    #34647292
Самурай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Drunechka и Программист-Любитель ОГРОМНОЕ СПАСИБО!))) Теперь всё работает так, как нужно!))
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.02.2016, 08:57
    #39174920
guest123123222
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
использовать GoTo в 21 веке? это не язык программирования, это чудовище
...
Рейтинг: 0 / 0
19.02.2016, 09:15
    #39174927
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
guest123123222использовать GoTo в 21 веке? это не язык программирования, это чудовище

спагетти можно сварить и без GOTO
еще круче получится
-------------
всегда применяла GOTO для выхода на конец процедуры или обработку ошибок
причем задолго до того, как прочитала про структурное программирование
...
Рейтинг: 0 / 0
19.02.2016, 10:01
    #39174963
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
guest123123222использовать GoTo в 21 веке?
Потрясающая глупость... а если бы синтаксис требовал другого литерала? например ON ERROR EXECUTE FROM label ? язык бы подходил для 21 века?
...
Рейтинг: 0 / 0
19.02.2016, 10:05
    #39174969
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
guest123123222использовать GoTo в 21 веке? это не язык программирования, это чудовище

а критиковать посты десятилетней давности, даже не замечая этого - ещё хуже...
...
Рейтинг: 0 / 0
19.02.2016, 10:08
    #39174975
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
vmagа критиковать посты десятилетней давности, даже не замечая этого - ещё хуже...
Претензии - к движку форума. У него бывают заскоки, и он в списке обновлённых сообщений совершенно безосновательно отображает древние темы. Отвечающий редко начинает просмотр темы с изучения дат публикации сообщений - обычно читают сами сообщения, и, если от контента не веет древностью, на даты вообще не смотрят. Сам пару раз так прокалывался.
...
Рейтинг: 0 / 0
19.02.2016, 10:23
    #39174989
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Akina,

а может и от браузера зависит и от внимательности... обычно когда тыкаешь ответить - то выскакивает напоминалка типа "а ничего что сообщению уже больше года ?"
...
Рейтинг: 0 / 0
19.02.2016, 10:23
    #39174990
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
Akina,

а может и от браузера зависит и от внимательности... обычно когда тыкаешь ответить - то выскакивает напоминалка типа "а ничего что сообщению уже больше года ?"
...
Рейтинг: 0 / 0
19.02.2016, 10:25
    #39174991
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
vmag,

хотя да, движок поддает - один раз нажал отправить...
...
Рейтинг: 0 / 0
19.02.2016, 10:54
    #39175025
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try catch в VBA
vmagобычно когда тыкаешь ответить - то выскакивает напоминалка типа "а ничего что сообщению уже больше года ?"Значит, у меня всё необычно - ни разу не видел такого сообщения.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / try catch в VBA / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]