Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 On Error не работает  [new]
pavel1381
Member

Откуда:
Сообщений: 18
Добрый день! столкнулся с проблемой при использовании обработчика ошибок: есть две формы к которым я обращаюсь в своей процедуре, если формы не открыт то появляется ошибка 2450, на формах есть галочки состояние которых я проверяю в коде( т.е. отмечена или нет) почему то если ее не активировать то появляется ошибка 13(не определен тип), можно просто поставить и снять галку и все ок, но я хотел написать обработчик, что бы при возникновении этих ошибок программ перескакивал дальше и работала. Получается так:
при обращении к форме 1 появляется ошибка 2450- не найдена форма, обработчик ошибок ловит ее, появляется сообщение откройте форму, открываю форму иду далее, появляется вторая ошибка - 13, обработчик ее ловит перескакиваю иду дальше, обращаюсь ко второй форме - опять появляется ошибка 2450, но ее уже почему то обработчик не ловит и не обрабатывает, в чем дело не пойму, может кто то сталкивался с эти????

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
25 июл 18, 13:21    [21601041]     Ответить | Цитировать Сообщить модератору
 Re: On Error не работает  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19108
Это не обработчик ошибок, а заготовка под Double Fault. Где, блин, Resume?
25 июл 18, 14:28    [21601239]     Ответить | Цитировать Сообщить модератору
 Re: On Error не работает  [new]
pavel1381
Member

Откуда:
Сообщений: 18
поясните пожалуйста в чем именно двойная ошибка??? и зачем мне использовать On Error Resume Next? если я наоборот хочу разобраться с этой ошибкой, не ну может это выход конечно потом применить On Error Goto 0, но мне не понятно почему когда ошибка возникает On Error ее не перехватывает, как будто он не активен в этот момент, первый раз срабатывает, а когда повторная ошибка возникает то нет????
25 июл 18, 15:13    [21601479]     Ответить | Цитировать Сообщить модератору
 Re: On Error не работает  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19108
pavel1381
в чем именно двойная ошибка???
Двойная ошибка - это ошибка во время выполнения обработчика ошибок.

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

pavel1381
почему когда ошибка возникает On Error ее не перехватывает
Именно поэтому. И это ещё облегчённый вариант проблемы.
25 июл 18, 15:40    [21601644]     Ответить | Цитировать Сообщить модератору
 Re: On Error не работает  [new]
pavel1381
Member

Откуда:
Сообщений: 18
Все я разобрался, опытным путем))) я заменил 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
25 июл 18, 15:50    [21601717]     Ответить | Цитировать Сообщить модератору
 Re: On Error не работает  [new]
pavel1381
Member

Откуда:
Сообщений: 18
там где я читал про обработчик ошибок, про Resume объясняется на примере resume next и как я понял эта команда дает команду пропустить ошибку и выполнять программу дальше со следующей строки, ну и как выяснилось можно указать свою метку, ну а что еще он делает такого? то есть как перезагружает, возобновляет обработку ошибок, но почему она прервалась, вот что непонятно?
25 июл 18, 15:55    [21601749]     Ответить | Цитировать Сообщить модератору
 Re: On Error не работает  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19108
pavel1381
там где я читал про обработчик ошибок, про Resume объясняется на примере resume next и как я понял эта команда дает команду пропустить ошибку и выполнять программу дальше со следующей строки
Хреново читал.
Resume Next
On Error Resume Next

Есть разница?
25 июл 18, 20:52    [21602681]     Ответить | Цитировать Сообщить модератору
 Re: On Error не работает  [new]
POKEP
Member

Откуда: Moskvich
Сообщений: 16
Мне нравится пользоваться примерно такой конструкцией (заготовкой) обработчика ошибок. Почти во всех процедурах и функциях, как связанных с формами, так и обычных модулях.


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
26 июл 18, 13:44    [21604262]     Ответить | Цитировать Сообщить модератору
 Re: On Error не работает  [new]
pavel1381
Member

Откуда:
Сообщений: 18
я конечно не все источники прочитал, но только в одном я нашел не совсем понятное объяснение:

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

из этого я понял следующее: что обработчик ошибок может отловить только одну ошибку в промежутке между on erro и resume, если между on erro и resume возникнет еще одна ошибка то он в этот момент не активен, resume видимо не только возвращает нас к продолжению выполнения кода с указанной строки, но и перегружает сам обработчик ошибок...
26 июл 18, 15:46    [21605004]     Ответить | Цитировать Сообщить модератору
 Re: On Error не работает  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19108
pavel1381
из этого я понял следующее: что обработчик ошибок может отловить только одну ошибку в промежутке между on erro и resume, если между on erro и resume возникнет еще одна ошибка то он в этот момент не активен, resume видимо не только возвращает нас к продолжению выполнения кода с указанной строки, но и перегружает сам обработчик ошибок...

Ну для базового понимания - достаточно.

Как следствие, оператор Resume
Akina
ОБЯЗАН быть. Причём максимально рано. И уж тем более до любых действий, которые потенциально могут привести к ошибке.
Иными словами - MsgBox это почти предел для кода обработчика ошибки. А то есть всякие... пионэры, которые в обработчике ошибок горят желанием переконнектиться к базе, записать ошибку в лог, или учинить ещё какую ерунду...
26 июл 18, 16:06    [21605136]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить