powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / отловить ошибку runtime
25 сообщений из 60, страница 2 из 3
отловить ошибку runtime
    #39772425
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторOne last point: Don’t let your error handling trigger an infinite error loop. When your code is
already in an error-handling situation, or if it is just trying to finish the procedure, set your error
trapping to On Error Resume Next . That way, your code continues, ignoring any errors that occur.
If you don’t add that statement, you might end up in an infinite loop where an error in your error
handler triggers the error handler again and again.
Еще раз перечитал пояснение того зачем вставлять On Error Resume Next . Авторы книги, полагают, что установкой в код обработчика On Error Resume Next можно избежать "залупливания" кода, то есть если случилась ошибка в обработчике ошибке, как указывается в MS-справке ошибка не будет обработана и исполнение перейдет к той строке, которая вызывала эту ошибку и, получается, что сразу же опять попадет в обработчик ошибок, т.к. ошибка все еще существует и так начнется "луп". Установкой On Error Resume Next эта ситуация устраняется. В общем, логично. Но вот как тогда быть с кодом ошибки, который обнуляется - не понятно. И вот, на примере с Overflow получается что ошибка в обработчике ошибок таки обрабатывается.. что-то совсем путаница получается
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772470
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр,

Мне кажется что On Error Resume Next и On Error GoTo вообще задумали для обхода форс мажора, при Next выполняется следующий оператор после того в котором была ошибка, при GoTo уход на метку...
Примеры форс мажора:
1. Есть куча вычислений, где возможно возникнет деление на ноль, но пользователю не желательно прекращать процесс даже в этом случае, ибо следующие операторы смогут переварить данную ситуацию, - естественно On Error Resume Next
2. Мне нужно прочитать набор записей, но:
- я не знаю сколько записей в наборе (разные причины могут быть)
- набор записей большой, но поврежден и я не знаю в каком месте его чтение прекратится...
В этом случае On Error GoTo будет прекрасным сигнализатором конца набора...

За всю историю всего один раз использовал On Error GoTo как раз чтоб вытащить хоть что-то из большого битого набора... On Error Resume Next не использую вообще, но вижу нужным только в одном случае - если я на него попадаю сразу после On Error GoTo - это позволит несмотря ни на что попытаться закрыть все открытые наборы, сессии, порты и т.д. Соответственно анализировать причинную ошибку нужно между On Error GoTo и On Error Resume Next
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772480
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag, полностью с Вами согласен. Как вариант сохранить ошибку и описание в обработчике до On Error Resume Next в переменную, скорее всего в глобальную, чтобы не надо было ее каждый раз объявлять в каждой процедуре или функции и перед выходом затирать переменную. Так точно будет работать и "залупливание" тоже не случится, и даже в случае как я привел пример с overflow, фактическая ошибка будет нормально отображена в msgbox, то есть цель будет достигнута в полной мере, правда обработчик станет несколько замороченным, но работать будет, не будет ли это перегибом с такими заморочками?
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772499
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с другой стороны access не все ли равно что обрабатывать. несколько доп.строк кода ничего радикально не изменят. но ошибку обработают как надо
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772517
Вышло?
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772556
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейВиловат, получилось, что наступило 6 утра
. сегодня все "испробую"
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772557
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да все работает. overflow скорее всего был из-за того, что в процедуре обработки ошибки параметр номер был as Integer .
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772558
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772559
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обработчик в процедуре
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
On Error GoTo Error_Handler 'обработчик ошибок
'====================================

'код процедуры

'======================
Exit_Sub: 'обработчик ошибок
     On Error Resume Next
     Exit Sub
Error_Handler:
     Call prcErrData(Err.Number, Err.Description, Err.Source)
     On Error Resume Next
     If strErrNumber <> 0 Then Call prcОбработкаОшибок(lngErrNumber, strErrDesc, strErrObj)
     Resume Exit_Sub
     Resume
End Sub


МОДУЛЬ обработки ошибки
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Option Compare Database
Option Explicit
Public lngErrNumber As Long, strErrDesc As String, strErrObj As String, varUserkod As Integer

'обработчик ошибок для VBA ErrObject
Public Sub prcОбработкаОшибок(Номер As Long, Описание As String, Источник As String)
DoCmd.SetWarnings True
MsgBox "В приложении произошла ошибка!" _
     & vbNewLine & "Сообщите разработчику следующую информацию: " _
     & vbNewLine & "Номер ошибки: " & Номер _
     & vbNewLine & "Описание ошибки: " & Описание _
     & vbNewLine & "Объект ошибки: " & Источник, _
     vbCritical, "Информация об ошибке"
Err.Clear 'обнуляем объект
End Sub

'запоминаем данные ошибки
Public Sub prcErrData(Номер As Long, Описание As String, Источник As String)
lngErrNumber = Номер
strErrDesc = Описание
strErrObj = Источник
End Sub
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772560
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот так совсем правильно будет
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
On Error GoTo Error_Handler 'обработчик ошибок
'====================================
'код процедуры
'======================
Exit_Sub: 'обработчик ошибок
     On Error Resume Next
     Exit Sub
Error_Handler:
     Call prcErrData(Err.Number, Err.Description, Err.Source)
     On Error Resume Next
     If lngErrNumber <>0 Then Call prcОбработкаОшибок(lngErrNumber, strErrDesc, strErrObj)
     Resume Exit_Sub
     Resume


модуль обработки ошибки
Код: 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.
Option Compare Database
Option Explicit
Public lngErrNumber As Long, strErrDesc As String, strErrObj As String, varUserkod As Integer

'обработчик ошибок для VBA ErrObject
Public Sub prcОбработкаОшибок(Номер As Long, Описание As String, Источник As String)
DoCmd.SetWarnings True
MsgBox "В приложении произошла ошибка!" _
     & vbNewLine & "Сообщите разработчику следующую информацию: " _
     & vbNewLine & "Номер ошибки: " & Номер _
     & vbNewLine & "Описание ошибки: " & Описание _
     & vbNewLine & "Объект ошибки: " & Источник, _
     vbCritical, "Информация об ошибке"
Err.Clear 'обнуляем объект
lngErrNumber = 0
strErrDesc = vbNullString
strErrObj = vbNullString
End Sub

'запоминаем данные ошибки
Public Sub prcErrData(Номер As Long, Описание As String, Источник As String)
lngErrNumber = Номер
strErrDesc = Описание
strErrObj = Источник
End Sub
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772567
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александрвот так совсем правильно будетОбычно всё таки обработчик ошибок несколько сложней (если не On Error Resume Next ). Есть ветвления через Select Case и вывод не окна с описанием ошибки (рядовому пользователю это ничего не даст), а логирование в файл. Так же я добавляю к прочему описанию ошибки и место возникновения ошибки - название модуля/класса и процедуры/функции. Можно в особо сложных местах выводить в лог номер строки - VBA.Information.Erl (в скрытых методах).
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772568
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр
Код: vbnet
1.
2.
     Resume Exit_Sub
     Resume

Зачем два раза? Второе даже не достигается, т.к. с первого переход на Exit_Sub
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772569
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург, посмотрите пожалуйста в этом топике я в начале объяснил зачем 2 раза и пример из книги привел. так советуют авторы книги, чтобы легче было найти строку в которой ошибка была
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772570
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург, все верно. это был просто пример самого простого обработчика, ERL я пока убрал. оставил базовые функции, чтобы принципиально закрыть вопрос с которого начиналась данная тема. в остальном полностью с Вами согласен, что нужен доп.функционал, это окно больше для себя чтобы видеть то, что случилось без штатного окна DEBUGA
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772591
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр...это окно больше для себя чтобы видеть то, что случилось без штатного окна DEBUGAВ таком случае я предпочитаю выводить в окно Immediate. Но фломастеры разные.
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772609
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmagЗа всю историю всего один раз использовал On Error GoTo
Пардон, не понял. А как вы тогда обрабатываете ошибки? On Error GoTo - основа обработки ошибок, не представляю, как можно без него обойтись. Или имелся в виду On Error GoTo 0? Тогда да, он нафиг не нужен.
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772770
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShinПардон, не понял. А как вы тогда обрабатываете ошибки? On Error GoTo - основа обработки ошибок, не представляю, как можно без него обойтись.

Согласен, тут я не правильно трактовал, с этого начинается любая рукописная более-менее сложная процедура или функция, причем это доведено до такого автоматизма, что я не обращаю на это внимания, имелось ввиду потом, - далее по тексту нет больше On Error GoTo... Соответственно в реальных условиях
эта конструкция нужна только для отладки, далее в экплуатации она уже как правило не работает,
так, висит на всякий случай...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Sub Proc1()
On Error GoTo er1
'
'
'
Exit Sub
er1:
MsgBox "Ошибка Proc1!"
End Sub
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772838
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов АлександрПанург, посмотрите пожалуйста в этом топике я в начале объяснил зачем 2 раза и пример из книги привел. так советуют авторы книги, чтобы легче было найти строку в которой ошибка была

наиболее лучшим образом у меня работает такая конструкция
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
'в шапке модуля
Public RejDem0UpravlWork as boolean=true ' режим разработчика если истина
' ...
Private sub Test()
On error goto handle1
' ...
exit sub
handle1:
If  RejDem0UpravlWork then ' срабатывает только в режиме разработки
' останавливаем процедуру
stop
' по F8 переходим к ошибке
resume
end if
resume Exit_Sub ' в продакшене уходим на этот вариант


p.s. это "облегченная версия" - самая часто используемая, переработанная идея MrShin с всплывающими обработчиками
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39772885
Stanislav P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
'в шапке модуля
Public RejDem0UpravlWork as boolean=true ' режим разработчика если истина



Можно использовать директивы условной компиляции в коде: #CONST, #IF, #THEN, #ELSE.
Либо в параметрах проекта задавать. Код будет легче читаться.
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39773081
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav P, хрень эта условная компиляция. не пользуюсь и другим не советую.
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39773114
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleckoStanislav P, хрень эта условная компиляция. не пользуюсь и другим не советую.И с чего бы?
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39773451
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург, ну например управление отладкой у клиента кнопкой - не влезая в код. Думаю что вопрос был в #Else-щас уже и не вспомню все матюки.
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39774847
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПанургМожно в особо сложных местах выводить в лог номер строки - VBA.Information.Erl (в скрытых методах). имеете ввиду что в обычной ситуации не пользуете нумерация строк, но если попадается такая каверзная ошибка, что найти ее трудно, то нумеруете строки соответствующего модуля и еще раз запускается процедуру "отлова ошибки", которая в данном случае уже указывает на нужную строку?
почему спрашиваю - постоянно нумеровать строки - муторная тема, хотя MZ Tool с этим хорошо справляется, но наличие в тексте большого количество "циферок" совсем не способствует его удобочитаемости
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39774860
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр, номер строки нужен в логе - когда прога работает у клиента, если база в разработке то на ошибку хорошо укажет Resume (но конечно не только: watch помогает неплохо).
...
Рейтинг: 0 / 0
отловить ошибку runtime
    #39774889
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko, ну то есть получается, что если прога работает у клиента, то очень желательно, чтобы в ее коде все строки были нумерованными? иначе erl никак не поможет
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 2 из 3
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / отловить ошибку runtime
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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