Написал On Error Resume Next но access всё равно реагирует на ошибку. Почему?

S0ME0NE
Дата: 19.12.2011 08:52:55
Всем доброе утро! У меня MS Access 2003 и файлик с расширением mdb.

Вот такая обработка ошибок, но access всё равно обрабатывает по своему.
Обрабатывает т.е. сообщает пользователю об ошибке и предлагает ему нажать кнопки End Debug и т.д.
+

Private Sub trpr()
On Error GoTo Err1

Dim errD, errN

...
...
...

rstMDB.Close
cnnMDB.Close

Set rstMDB = Nothing
Set cnnMDB = Nothing

MsgBox "ГОТОВО"
Exit Sub
Err1:
errD = Err.Description
errN = Err.Number

On Error Resume Next

rstMDB.Close
cnnMDB.Close

Set rstMDB = Nothing
Set cnnMDB = Nothing

If errN <> 0 Then
MsgBox errD & vbCrLf & vbCrLf & Err.Description
End If
End Sub

alvk
Дата: 19.12.2011 09:09:40
S0ME0NE
MsgBox errD & vbCrLf & vbCrLf & Err.Description


Поясните, что по вашему мнению должно быть написано в msgbox? И чем отличается ваш вариант от стандартного? Больше кода?
energy75
Дата: 19.12.2011 09:13:17
Err1:
errD = Err.Description
errN = Err.Number
Err.Clear
Старый ворчун
Дата: 19.12.2011 09:17:03
S0ME0NE
Вот такая обработка ошибок, но access всё равно обрабатывает по своему.

В обработчике ошибки не может не может объявляться другой обработчик, используйте Resume, Resume Next или Resume метка (или On Error GoTo -1)
см. Обработка ошибок. вопросы и ответы (error handling F.A.Q.)
S0ME0NE
Дата: 19.12.2011 09:45:28
Спасибо большое спасибо.

для alvk
- Я хотел чтобы, в случае ошибок, access не пускал пользователя в модуль (в текст программы)
по кнопке Debug пользователь туда может попасть
- Я хотел чтобы, в случае ошибок, access выдавал мой вариант сообщения
If errN <> 0 Then
     MsgBox errD & vbCrLf & vbCrLf & Err.Description
End If
а не свой access-овский, где он предлагает пользователю нажать кнопки End, Debug и что-то ещё

и в тоже время мне не хотелось компилировать файл mdb (т.е. делать его mde)

Я по внимательней почитаю Вашу ссылку Старый ворчун
для energy75
так не подходит потому что переменные
rstMDB.Close
cnnMDB.Close
всё-таки содержат ошибку и именно из-за них access выдаёт сообщение
(сетевой диск был недоступен и простая перезагрузка системы <компьютера пользователя> исправила положение)
energy75
Дата: 19.12.2011 09:50:56
S0ME0NE
для energy75
так не подходит потому что ...


err.clear перед любым resume крайне необходимая вещь, так что на будущее все равно пригодится.
Диам
Дата: 19.12.2011 10:01:05
alvk
S0ME0NE
MsgBox errD & vbCrLf & vbCrLf & Err.Description

Поясните, что по вашему мнению должно быть написано в msgbox? И чем отличается ваш вариант от стандартного? Больше кода?

У человека проблема не в том, что выводится сообщение, а в том, что сообщение выводится не в виде ЕГО мессаджбокса, а ввиде системного сообщения с предложение пойти в DEBUG.

Public Sub test2()
  On Error GoTo mEr
  Dim a As Long, b As Long
  a = 3 / 0
  
mEx:
  On Error Resume Next
  b = 5 / 0
  Exit Sub
mEr:
  MsgBox err.Description
  Resume mEx
End Sub


вот тут ошибка деления на ноль для b не возникнет. А иногда ошибка возникает, когда в выходе из процедуры, несмотря на предыдущее On Error Resume Next, идет обращение к объектам, которые еще не были созданы (например пытаешься закрыть Excel.Application, а она до возникновения ошибки не была создана, но это возникает не всегда. Я у себя при закрытии объектных переменных, даже если они в On Error Resume Next делаю проверку if Not dbs is Nothing. Это помогает).
alvk
Дата: 19.12.2011 10:04:48
S0ME0NE,

Err1:
errD = Err.Description
errN = Err.Number
If errN <> 0 Then
MsgBox errD & vbCrLf & vbCrLf & Err.Description
End If


Если убрать переменные для наглядности:

Err1:
If Err.Number <> 0 Then
MsgBox Err.Description & vbCrLf & vbCrLf & Err.Description
End If


и что же мы имеем?
Диам
Дата: 19.12.2011 10:10:31
А... таки понял.
Если ошибка вызвала переход в блок обработки ошибок, то объявление в этом блоке On Error Resume Next не дает ожидаемого результата

Public Sub test3()
  On Error GoTo mEr
  Dim a As Long, b As Long
  a = 3 / 0
  
mEx:
  Exit Sub
mEr:
  MsgBox err.Description
  On Error Resume Next
  b = 5 / 0
  Resume mEx
End Sub
Старый ворчун
Дата: 19.12.2011 10:10:48
Диам
Это помогает).

хорошо помогает изучение вопроса, чтобы понимать, что происходит...