Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / On Error не работает / 10 сообщений из 10, страница 1 из 1
25.07.2018, 13:21
    #39678879
pavel1381
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error не работает
Добрый день! столкнулся с проблемой при использовании обработчика ошибок: есть две формы к которым я обращаюсь в своей процедуре, если формы не открыт то появляется ошибка 2450, на формах есть галочки состояние которых я проверяю в коде( т.е. отмечена или нет) почему то если ее не активировать то появляется ошибка 13(не определен тип), можно просто поставить и снять галку и все ок, но я хотел написать обработчик, что бы при возникновении этих ошибок программ перескакивал дальше и работала. Получается так:
при обращении к форме 1 появляется ошибка 2450- не найдена форма, обработчик ошибок ловит ее, появляется сообщение откройте форму, открываю форму иду далее, появляется вторая ошибка - 13, обработчик ее ловит перескакиваю иду дальше, обращаюсь ко второй форме - опять появляется ошибка 2450, но ее уже почему то обработчик не ловит и не обрабатывает, в чем дело не пойму, может кто то сталкивался с эти????

Код: vbnet
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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
Private Sub акт_пп_ремкомплект_Click()
Dim №заявки, №кса, w As String
Dim Data As Date
On Error GoTo error1

№заявки = Forms![ФЗаявки]![№заявки]
№кса = Forms![ФЗаявки]![КСА].Column(1)
Data = Forms![ФЗаявки]![Дата]
Me.Dirty = False



If Forms![Ф_движениеТС]![Ф_З_акт_пп].Value = True Then
Forms![Ф_движениеТС]![акт п/п].SetFocus
w = Forms![Ф_движениеТС]![акт п/п].Text
Else
w = Left(№кса, 2) + "/-Р-" + Right(Data, 2)
End If

m1:
If Forms![Ф_движение РемКомплектов]![Ф_З_акт_пп_рем].Value = True Then
Forms![Ф_движение РемКомплектов]![акт п/п №].SetFocus
w = Forms![Ф_движение РемКомплектов]![акт п/п №].Text
Else
w = Left(№кса, 2) + "/-Р-" + Right(Data, 2)
End If

m2:

DoCmd.OpenForm "Ф_движение РемКомплектов"
DoCmd.RunCommand acCmdRefresh
DoCmd.GoToRecord , , acNewRec

Forms![Ф_движение РемКомплектов]![Дата].SetFocus
Forms![Ф_движение РемКомплектов]![Дата].Text = Data

Forms![Ф_движение РемКомплектов]![акт п/п №].SetFocus
Forms![Ф_движение РемКомплектов]![акт п/п №].Text = w

Forms![Ф_движение РемКомплектов]![Передан в].SetFocus
Forms![Ф_движение РемКомплектов]![Передан в].Text = №кса

Forms![Ф_движение РемКомплектов]![Передал].SetFocus
Forms![Ф_движение РемКомплектов]![Передал].Text = "Королев"

Forms![Ф_движение РемКомплектов]![Основание].SetFocus
Forms![Ф_движение РемКомплектов]![Основание].Text = "Ремонт ТС"

Forms![Ф_движение РемКомплектов]![Заявка№].SetFocus
Forms![Ф_движение РемКомплектов]![Заявка№].Text = №заявки
m = 0


Exit Sub

error1:

Select Case Err.Number
Case 13

m = m + 1
w = Left(№кса, 2) + "/-Р-" + Right(Data, 2)
If m = 1 Then
GoTo m1
Else
GoTo m2
End If


Case 2450
msg = "Необходимо открыть формы 'Ф_движениеТС, Ф_движение РемКомплектов'"
title = "Внимание!"
ms = MsgBox(msg, vbOKOnly, title)
On Error GoTo 0
Err.Clear

Exit Sub
End Select




End Sub
...
Рейтинг: 0 / 0
25.07.2018, 14:28
    #39678937
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error не работает
Это не обработчик ошибок, а заготовка под Double Fault. Где, блин, Resume?
...
Рейтинг: 0 / 0
25.07.2018, 15:13
    #39678996
pavel1381
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error не работает
поясните пожалуйста в чем именно двойная ошибка??? и зачем мне использовать On Error Resume Next? если я наоборот хочу разобраться с этой ошибкой, не ну может это выход конечно потом применить On Error Goto 0, но мне не понятно почему когда ошибка возникает On Error ее не перехватывает, как будто он не активен в этот момент, первый раз срабатывает, а когда повторная ошибка возникает то нет????
...
Рейтинг: 0 / 0
25.07.2018, 15:40
    #39679025
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error не работает
pavel1381в чем именно двойная ошибка???Двойная ошибка - это ошибка во время выполнения обработчика ошибок.

pavel1381зачем мне использовать On Error Resume Next?Конечно незачем, Вот только On Error и Next - это Вы сами додумали. Я говорил совсем об ином - об операторе возврата из обработчика. У Вас его тупо нет - а он ОБЯЗАН быть. Причём максимально рано. И уж тем более до любых действий, которые потенциально могут привести к ошибке.

pavel1381почему когда ошибка возникает On Error ее не перехватываетИменно поэтому. И это ещё облегчённый вариант проблемы.
...
Рейтинг: 0 / 0
25.07.2018, 15:50
    #39679038
pavel1381
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error не работает
Все я разобрался, опытным путем))) я заменил GoTo m1 на Resume m1 и все работает, но я не понял почему??? почему именно resume?


Select Case Err.Number
Case 13

m = m + 1
w = Left(№кса, 2) + "/-Р-" + Right(Data, 2)
If m = 1 Then
'GoTo m1
Resume m1
Else
GoTo m2
End If
...
Рейтинг: 0 / 0
25.07.2018, 15:55
    #39679050
pavel1381
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error не работает
там где я читал про обработчик ошибок, про Resume объясняется на примере resume next и как я понял эта команда дает команду пропустить ошибку и выполнять программу дальше со следующей строки, ну и как выяснилось можно указать свою метку, ну а что еще он делает такого? то есть как перезагружает, возобновляет обработку ошибок, но почему она прервалась, вот что непонятно?
...
Рейтинг: 0 / 0
25.07.2018, 20:52
    #39679276
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error не работает
pavel1381там где я читал про обработчик ошибок, про Resume объясняется на примере resume next и как я понял эта команда дает команду пропустить ошибку и выполнять программу дальше со следующей строкиХреново читал.
Код: vbnet
1.
2.
Resume Next
On Error Resume Next


Есть разница?
...
Рейтинг: 0 / 0
26.07.2018, 13:44
    #39679614
POKEP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error не работает
Мне нравится пользоваться примерно такой конструкцией (заготовкой) обработчика ошибок. Почти во всех процедурах и функциях, как связанных с формами, так и обычных модулях.


Код: vbnet
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.
Public Function PictureRecordSource(ДецНомер As String, Optional iSnapShot As Integer = 1) As String

' Перехват обработки ошибок.
On Error GoTo Err_PictureRecordSource

' Локальные переменные.
Dim rRst            As ADODB.Recordset 


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


' Нормальное завершение функции.
PictureRecordSource_Exit:
    Exit Function

' Завершение функции после обработки ошибок.
Exit_PictureRecordSource:
    Err.Clear
    On Error Resume Next
    rRst.Close
    Set rRst = Nothing
    Exit Function

' Обработка ошибок.
Err_PictureRecordSource:
    MsgBox Err.Description & vbcrlf & "Код ошибки: " & Err.Number, vbCritical, "Модуль [02] -> Function [PictureRecordSource]"
    Resume Exit_PictureRecordSource

End Function
...
Рейтинг: 0 / 0
26.07.2018, 15:46
    #39679723
pavel1381
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error не работает
я конечно не все источники прочитал, но только в одном я нашел не совсем понятное объяснение:

Примечания Если оператор On Error не используется, любая ошибка во время выполнения является неустранимой; то есть отображается сообщение об ошибке и выполнение остановится. «Включенный» обработчик ошибок — это свойство, включен режим оператор On Error ; обработчик ошибок «активно» — это включенный обработчик, который находится в процессе обработки ошибки. При возникновении ошибки во время активности между (возникновения ошибки) и оператор Resume, Exit Sub, Exit Functionили Exit Property обработчик ошибок, обработчик ошибок текущей процедуры не может обрабатывать ошибки. Управление возвращается в вызывающую процедуру. Если вызывающей процедуры есть включенный обработчик ошибок, он активируется для обработки ошибки. Если обработчик ошибок вызывающей процедуры уже активен, элемент управления передает назад по вызову описанной выше процедуры, пока не будет обнаружен обработчик ошибок включена, но неактивный. Если обработчик ошибок неактивных, включено не найден, сообщения о неустранимых в точке, где она реально возникла ошибка. Каждый раз, когда обработчик ошибок передает управление обратно вызывающей процедуре, эта процедура становится текущей процедуры. После окончания обработки ошибки обработчиком любой из процедур, выполнение возобновляется в текущей процедуре на момент, обозначенного оператор Resume .

из этого я понял следующее: что обработчик ошибок может отловить только одну ошибку в промежутке между on erro и resume, если между on erro и resume возникнет еще одна ошибка то он в этот момент не активен, resume видимо не только возвращает нас к продолжению выполнения кода с указанной строки, но и перегружает сам обработчик ошибок...
...
Рейтинг: 0 / 0
26.07.2018, 16:06
    #39679734
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error не работает
pavel1381из этого я понял следующее: что обработчик ошибок может отловить только одну ошибку в промежутке между on erro и resume, если между on erro и resume возникнет еще одна ошибка то он в этот момент не активен, resume видимо не только возвращает нас к продолжению выполнения кода с указанной строки, но и перегружает сам обработчик ошибок...
Ну для базового понимания - достаточно.

Как следствие, оператор Resume
AkinaОБЯЗАН быть. Причём максимально рано. И уж тем более до любых действий, которые потенциально могут привести к ошибке.Иными словами - MsgBox это почти предел для кода обработчика ошибки. А то есть всякие... пионэры, которые в обработчике ошибок горят желанием переконнектиться к базе, записать ошибку в лог, или учинить ещё какую ерунду...
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / On Error не работает / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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