Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
добрый день знатокам и начинающим. заинтересовал один момент с обработкой ошибок
использую обычный обработчик ошибок

On Error GoTo Error_Handler 'обработчик ошибок
'====================================

'вставляем код процедуры

'======================
Exit_Sub: 'обработчик ошибок
     On Error Resume Next
     Exit Sub
Error_Handler:
     On Error Resume Next
     If Err.Number = 0 Then
          Resume Next
     Else
          Call prcОбработкаОшибок(Err.Number, Err.Description, Err.Source, Erl)
     End If
     Resume Exit_Sub
     Resume


Все хорошо работает, но есть проблем с ошибками типа: Run-Time error '-2147217900 (80040e14)': Лишняя скобка ) в выражении запроса '[ПользовательКод]=cint('" & varUsrKod "'))', то есть ошибка в SQL-запросе для ADO.open. Обработчик перехватывает данную ошибку, но ни описания, ни кода ошибки не дает. Есть какая-либо возможность качественно обработать такие ошибки, то есть получить в msgbox то самое описание, которое дает штатное окно ошибок, чтобы не забивать голову что же случилось и почему не делается то, что надо?

Заранее благодарю за подсказку
9 фев 19, 16:29    [21805282]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 328
Ганов Александр, описание ошибки доступа к данным нужно получать методом AccessError.
11 фев 19, 10:55    [21806153]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
Кривцов Анатолий, принято. благодарю за "наводку". уже открыл справку, изучу вопрос. очень хочется, чтобы не только отлавливало, но и в доступной форме поясняло суть ошибки
11 фев 19, 12:24    [21806255]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
Ганов Александр,

У вас интересный хандлер, не понимаю, как это работает
Error_Handler:
     On Error Resume Next
     If Err.Number = 0 Then


On Error Resume Next всегда сбрасывает ошибку, у вас после него всегда Err.Number = 0 и Err.Description пустое.
Не нужна эта команда.
11 фев 19, 13:27    [21806333]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 328
MrShin
On Error Resume Next всегда сбрасывает ошибку, у вас после него всегда Err.Number = 0 и Err.Description пустое.
Не нужна эта команда.
Вы ошибаетесь. Не сбрасывается. Сбросить можно методом Err.Clear, если Err <> 0.
А команда действительно не нужна, как и все, что выделено ниже.
Exit_Sub: 'обработчик ошибок
     On Error Resume Next
     Exit Sub
Error_Handler:
     On Error Resume Next
     If Err.Number = 0 Then
          Resume Next
     Else
          Call prcОбработкаОшибок(Err.Number, Err.Description, Err.Source, Erl)
     End If
     Resume Exit_Sub
     Resume
11 фев 19, 13:50    [21806377]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
Кривцов Анатолий, честно говоря, я его не сам придумал, а почерпнул в книге "Teresa Hennig, Rob Cooper, Geoffrey Griffith, Jerry Dennison. Access 2010. Programmer’s Reference" (прилагаю фрагмент книги)

-- первый on error resume next уже в самом Хендлере (а равно после Exit_Sub) нужен чтобы пропустить те ошибки, которые могут случиться в самом хендлере (привожу скрин из книги)
-- нулевые ошибки (то есть без описания не обрабатываются, поэтому на них стоит Resume next через IF, хотя конечно можно было бы написать все в одну строчку и просто обращаться к процедуре если ошибка не нулевая, но я оставил так, т.к. подумал, что потом может что-то надо будет дописать)
-- последний Resume тоже хорошо объяснен в книге, когда случается ошибка, то VBA не дает кодеру понять где она случилась, разве что нумеровать все строки и попытаться использовать функцию ERL, а вот с еще одним Resume в конце следующая штука: когда вылетает ошибка, в данном случае когда обрабатывается процедура prcОбработкаОшибок, то надо нажать не ок, а CTRL+Pause, откроется VBE, в нем желтая стрелка-указатель будет стоять в этот момент на строке Resume Exit_Sub, берем двигаем ее мышкой вниз на Resume и жмем F8, после чего стрелка-указатель перейдет именно на ту строку, в которой произошла ошибка, которая подняла окно. таким образом кодер может легко понять в какой именно строке случилась данная ошибка.

у меня нет большого опыта в access, как и нет повода не верить 4-м авторам книги, поэтому я доверился тому, что указано в книге Картинка с другого сайта.

К сообщению приложен файл. Размер - 79Kb
11 фев 19, 14:16    [21806420]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175


К сообщению приложен файл. Размер - 51Kb
11 фев 19, 14:16    [21806422]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
Кривцов Анатолий
Вы ошибаетесь. Не сбрасывается

Не соглашусь. Проэкспериментируйте.
11 фев 19, 14:48    [21806465]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
The Err object is automatically reset when an On Error Resume Next statement is executed.
11 фев 19, 14:49    [21806469]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
MrShin
On Error Resume Next всегда сбрасывает ошибку, у вас после него всегда Err.Number = 0 и Err.Description пустое.
Не нужна эта команда.

насколько я понимаю номер и описание ошибки будет сохранено до тех пор покуда не возникнет новая ошибка или не кончится процедура или функция. и, судя по всему, авторы книги перестраховываются и именно поэтому вставляют еще по одному Resume Next в обработчик ошибок и в процедуру выхода, т.к. если случится ошибка именно в этих местах, то она заменит описание той ошибки, которая инициировала цепочку всех событий и вызвала обработчик ошибок. не знаю конечно что такое может случиться уже в самом хендлере ошибок, но т.к. у авторов книги наверняка не малый опыт чтобы "накатать" книгу на 1230 стр., то я сделал так как написано
11 фев 19, 14:53    [21806472]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 328
MrShin
Кривцов Анатолий
Вы ошибаетесь. Не сбрасывается

Не соглашусь. Проэкспериментируйте.
Перед своим постом провел самоконтроль.
On Error Resume Next
Dim a&
    a = 1 / 0
    MsgBox Err.Number & "  " & Err.Description
Выдает "11 Devision by 0"
А так сбрасывает уже существующую ошибку.
On Error Resume Next
Dim a&
    a = 1 / 0
On Error Resume Next
    MsgBox Err.Number & "  " & Err.Description
Но это как-то коряво, что ли. И да, у ТС это тот случай, согласен.

А вот про "последний Resume" я не знал. Теперь знаю.
11 фев 19, 15:05    [21806491]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
Кривцов Анатолий
Перед своим постом провел самоконтроль.

Не понял. Последний вариант у меня выдает 0 и пустоту, как и ожидалось. У вас выдает текст ошибки??? Может это в старых версиях такая особенность? У меня 2010, все сбрасывается, более ранней версии нет для проверки.

Кривцов Анатолий
А вот про "последний Resume" я не знал. Теперь знаю

Я сам постоянно использую Resume, который никогда не выполняется - для отладки. Только в описании пропущен момент, что на Resume надо сначала перевести курсор выполнения с помощью Ctrl-F9, только потом жать F8
11 фев 19, 15:20    [21806518]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
MrShin
Кривцов Анатолий
Вы ошибаетесь. Не сбрасывается

Не соглашусь. Проэкспериментируйте.

проверял обработчик по шагам, когда случается ошибка идет переход On Error Resume Next, затем жмем следующий шаг через F8 и система без проблем выдает сохраненное сообщение и его номер.
что самое интересно, в справке MS написано следующее:

An "enabled" error handler is one that is turned on by an On Error statement; an "active" error handler is an enabled handler that is in the process of handling an error. If an error occurs while an error handler is active (between the occurrence of the error and a Resume, Exit Sub, Exit Function, or Exit Property statement), the current procedure's error handler can't handle the error. Control returns to the calling procedure.

То есть если ошибка случится уже в самой процедуре обработки, то должен произойти переход обратно к тому месту, откуда был совершен вызов. Тогда мне тоже не очень понятно зачем тут нужен еще один On Error Resume Next уже в самом обработчике ошибок
11 фев 19, 15:21    [21806519]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
автор
Я сам постоянно использую Resume, который никогда не выполняется - для отладки. Только в описании пропущен момент, что на Resume надо сначала перевести курсор выполнения с помощью Ctrl-F9, только потом жать F8

я просто сказал про мышку, можно и через CTRL+F9
автор
берем двигаем ее мышкой вниз на Resume

тут кому как удобнее
11 фев 19, 15:24    [21806524]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
Ганов Александр
проверял обработчик по шагам

Какая у вас версия Акцесса?
11 фев 19, 15:34    [21806541]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
В вашем случае второй On Error Resume Next не нужен однозначно. Там негде возникнуть ошибке, если prcОбработкаОшибок содержит нормальный обработчик ошибок и он не поднимает ошибку наверх принудительно.
11 фев 19, 15:36    [21806545]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
MrShin, 2016
11 фев 19, 15:39    [21806548]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
MrShin
В вашем случае второй On Error Resume Next не нужен однозначно. Там негде возникнуть ошибке, если prcОбработкаОшибок содержит нормальный обработчик ошибок и он не поднимает ошибку наверх принудительно.

согласен
11 фев 19, 15:40    [21806549]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
Ганов Александр
2016

Ничего не понимаю. Попробовал в 2016 - то же самое, сбрасывается. Как такое возможно???
11 фев 19, 15:43    [21806554]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
MrShin, не могу знать к сожалению, у меня 100% работает. проверял не раз когда тестировал и ошибки когда случаются показывает все как надо Картинка с другого сайта.
11 фев 19, 15:47    [21806562]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
Ганов Александр
у меня 100% работает

Тем не менее я бы не рекомендовал использовать это. Видимо, есть какие-то особенности, нужно выяснять. Тем более я привел ссылку из книги, которая подтверждает такое поведение.
11 фев 19, 15:56    [21806572]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
MrShin, похоже что я Вас дезинформировал. действительно скидывает. вставил 2 дебага.print до и после Resume Next, второй дебаг показывает любую ошибку как ноль. то есть до Resume Next ошибка есть, после становится ноль

К сообщению приложен файл (пример.zip - 46Kb) cкачать
11 фев 19, 16:46    [21806635]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
нашел откуда ноги растут - в обработчиках функций у меня в шаблоне MZ Tool нет этой строки, а в обработчике для процедур она есть, судя по всему, я проверял в функции и распространил положительный результат на все обработчики. Получается, что книжка совершенно права, действительно скидывает ошибку. Подправил все дела в базе и в шаблоне. Благодарствую за наблюдательность
11 фев 19, 16:50    [21806643]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
Ганов Александр
Подправил все дела в базе и в шаблоне

Так возвращаясь к первоначальному вопросу, заработало как есть после удаления строки или все еще AccessError требуется?
11 фев 19, 16:58    [21806658]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
MrShin, теперь еще более интересно стало. ошибка ловится. но ее размер ее err.number вызывает overflow

К сообщению приложен файл. Размер - 13Kb
11 фев 19, 17:15    [21806678]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
автор
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 получается что ошибка в обработчике ошибок таки обрабатывается.. что-то совсем путаница получается
11 фев 19, 17:34    [21806705]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
vmag
Member

Откуда: MP
Сообщений: 3266
Ганов Александр,

Мне кажется что 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
11 фев 19, 18:18    [21806772]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
vmag, полностью с Вами согласен. Как вариант сохранить ошибку и описание в обработчике до On Error Resume Next в переменную, скорее всего в глобальную, чтобы не надо было ее каждый раз объявлять в каждой процедуре или функции и перед выходом затирать переменную. Так точно будет работать и "залупливание" тоже не случится, и даже в случае как я привел пример с overflow, фактическая ошибка будет нормально отображена в msgbox, то есть цель будет достигнута в полной мере, правда обработчик станет несколько замороченным, но работать будет, не будет ли это перегибом с такими заморочками?
11 фев 19, 18:39    [21806791]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
с другой стороны access не все ли равно что обрабатывать. несколько доп.строк кода ничего радикально не изменят. но ошибку обработают как надо
11 фев 19, 19:39    [21806828]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
АлексейВиловат
Member

Откуда: Киев
Сообщений: 1
Вышло?
11 фев 19, 21:12    [21806861]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
АлексейВиловат, получилось, что наступило 6 утра Картинка с другого сайта.. сегодня все "испробую"
12 фев 19, 01:52    [21806946]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
да все работает. overflow скорее всего был из-за того, что в процедуре обработки ошибки параметр номер был as Integer.

К сообщению приложен файл. Размер - 30Kb
12 фев 19, 02:41    [21806950]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175


К сообщению приложен файл (пример.zip - 69Kb) cкачать
12 фев 19, 02:43    [21806951]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
Обработчик в процедуре
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

МОДУЛЬ обработки ошибки
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
12 фев 19, 02:54    [21806953]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
вот так совсем правильно будет
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

модуль обработки ошибки
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
12 фев 19, 03:03    [21806954]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 4362
Ганов Александр
вот так совсем правильно будет
Обычно всё таки обработчик ошибок несколько сложней (если не On Error Resume Next). Есть ветвления через Select Case и вывод не окна с описанием ошибки (рядовому пользователю это ничего не даст), а логирование в файл. Так же я добавляю к прочему описанию ошибки и место возникновения ошибки - название модуля/класса и процедуры/функции. Можно в особо сложных местах выводить в лог номер строки - VBA.Information.Erl (в скрытых методах).
12 фев 19, 04:16    [21806965]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 4362
Ганов Александр
     Resume Exit_Sub
     Resume
Зачем два раза? Второе даже не достигается, т.к. с первого переход на Exit_Sub
12 фев 19, 04:21    [21806966]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
Панург, посмотрите пожалуйста в этом топике я в начале объяснил зачем 2 раза и пример из книги привел. так советуют авторы книги, чтобы легче было найти строку в которой ошибка была
12 фев 19, 04:32    [21806969]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
Панург, все верно. это был просто пример самого простого обработчика, ERL я пока убрал. оставил базовые функции, чтобы принципиально закрыть вопрос с которого начиналась данная тема. в остальном полностью с Вами согласен, что нужен доп.функционал, это окно больше для себя чтобы видеть то, что случилось без штатного окна DEBUGA
12 фев 19, 04:34    [21806970]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 4362
Ганов Александр
...это окно больше для себя чтобы видеть то, что случилось без штатного окна DEBUGA
В таком случае я предпочитаю выводить в окно Immediate. Но фломастеры разные.
12 фев 19, 08:12    [21807018]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
vmag
За всю историю всего один раз использовал On Error GoTo

Пардон, не понял. А как вы тогда обрабатываете ошибки? On Error GoTo - основа обработки ошибок, не представляю, как можно без него обойтись. Или имелся в виду On Error GoTo 0? Тогда да, он нафиг не нужен.
12 фев 19, 09:10    [21807042]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
vmag
Member

Откуда: MP
Сообщений: 3266
MrShin
Пардон, не понял. А как вы тогда обрабатываете ошибки? On Error GoTo - основа обработки ошибок, не представляю, как можно без него обойтись.


Согласен, тут я не правильно трактовал, с этого начинается любая рукописная более-менее сложная процедура или функция, причем это доведено до такого автоматизма, что я не обращаю на это внимания, имелось ввиду потом, - далее по тексту нет больше On Error GoTo... Соответственно в реальных условиях
эта конструкция нужна только для отладки, далее в экплуатации она уже как правило не работает,
так, висит на всякий случай...
Public Sub Proc1()
On Error GoTo er1
'
'
'
Exit Sub
er1:
MsgBox "Ошибка Proc1!"
End Sub
12 фев 19, 13:05    [21807309]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 551
Ганов Александр
Панург, посмотрите пожалуйста в этом топике я в начале объяснил зачем 2 раза и пример из книги привел. так советуют авторы книги, чтобы легче было найти строку в которой ошибка была


наиболее лучшим образом у меня работает такая конструкция
'в шапке модуля
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 с всплывающими обработчиками
12 фев 19, 14:13    [21807402]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Stanislav P
Member

Откуда: Сочи
Сообщений: 96
'в шапке модуля
Public RejDem0UpravlWork as boolean=true ' режим разработчика если истина


Можно использовать директивы условной компиляции в коде: #CONST, #IF, #THEN, #ELSE.
Либо в параметрах проекта задавать. Код будет легче читаться.
12 фев 19, 15:03    [21807485]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 551
Stanislav P, хрень эта условная компиляция. не пользуюсь и другим не советую.
12 фев 19, 22:34    [21807889]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 4362
alecko
Stanislav P, хрень эта условная компиляция. не пользуюсь и другим не советую.
И с чего бы?
13 фев 19, 03:56    [21807954]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 551
Панург, ну например управление отладкой у клиента кнопкой - не влезая в код. Думаю что вопрос был в #Else-щас уже и не вспомню все матюки.
13 фев 19, 15:41    [21808613]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
Панург
Можно в особо сложных местах выводить в лог номер строки - VBA.Information.Erl (в скрытых методах).
имеете ввиду что в обычной ситуации не пользуете нумерация строк, но если попадается такая каверзная ошибка, что найти ее трудно, то нумеруете строки соответствующего модуля и еще раз запускается процедуру "отлова ошибки", которая в данном случае уже указывает на нужную строку?
почему спрашиваю - постоянно нумеровать строки - муторная тема, хотя MZ Tool с этим хорошо справляется, но наличие в тексте большого количество "циферок" совсем не способствует его удобочитаемости
16 фев 19, 11:41    [21811451]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 551
Ганов Александр, номер строки нужен в логе - когда прога работает у клиента, если база в разработке то на ошибку хорошо укажет Resume (но конечно не только: watch помогает неплохо).
16 фев 19, 12:30    [21811483]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
alecko, ну то есть получается, что если прога работает у клиента, то очень желательно, чтобы в ее коде все строки были нумерованными? иначе erl никак не поможет
16 фев 19, 13:46    [21811546]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 4362
Ганов Александр, нумеровать всё и вся не имеет смысла. Лично я довольно редко это делаю, только там где не уверен во всех случаях, на всякий, так сказать. Да и не все строки нумерую.
16 фев 19, 15:15    [21811631]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
Панург, принял, спасибо. мне тоже думается, что все и вся нумеровать - очень муторное занятие и лишние символы в коде
17 фев 19, 03:28    [21811943]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 551
alecko
, ну например управление отладкой у клиента кнопкой - не влезая в код. Думаю что вопрос был в #Else-щас уже и не вспомню все матюки.

Во - ещё вспомнил - в режиме разработки часть полей открываем, у клиента они закрыты - это тоже делаем этой переменной (одной переменной переход в режим разработки/тестирование "клиентского вида" - переменная условной компиляции здесь никак не поможет-поля нужно все равно закрывать (полагаться на вид по умолчанию с учетом того что форма принимает тучу состояний категорически нельзя), бывает закрываю создание всяких контекстных менюшек, выскакивание предупреждающих окон, создание и печать отчетов, отсылку писем, смс во время разработки.
19 фев 19, 16:57    [21814564]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
Панург
место возникновения ошибки - название модуля/класса и процедуры/функции

подскажите пожалуйста как реализуете? на форуме почитал, начиная от идеи прописывать имя процедуры в обработке и заканчивая сторонними утилитами - как-то мутновато, может что-то поразумнее имеется. спасибо
17 мар 19, 13:01    [21835143]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
NBjHCBrc6KlSObm
Member

Откуда:
Сообщений: 72
Ганов Александр
подскажите пожалуйста как реализуете? на форуме почитал, начиная от идеи прописывать имя процедуры в обработке и заканчивая сторонними утилитами - как-то мутновато, может что-то поразумнее имеется. спасибо

mz-tools всё делают: и номера к строкам добавляют, и сообщение с названием процедуры и названием модуля добавляют.
Я отправляю письмо, сохраняю названия формы и значения контролов, записываю в журнал, делаю скриншот - это удобно и проще, чем потом спрашивать "что вы делали 15-го августа 1993 года" у пользователя :)
17 мар 19, 15:35    [21835255]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
NBjHCBrc6KlSObm, спасибо. полностью согласен, обработчик ошибок доработал, теперь показывает все, что нужно. Топик закрыт :-)
17 май 19, 11:07    [21887017]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
в продолжение темы: как обычно делают когда надо поменять все обработчики во всех или отдельном модуле? понятное дело, что руками "умрешь" это делать. Озадачился данным вопросом, пошукал, вроде ничего нет нужного, потратил время - написал автозамену и/или добавление обработчика в процедуру. Вроде все как надо работает, но может есть какие-то общепризнанные и общеиспользуемые решение, где не надо ничего самому писать, так сказать plug and play?
24 май 19, 12:20    [21893016]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
NBjHCBrc6KlSObm
Ганов Александр
подскажите пожалуйста как реализуете? на форуме почитал, начиная от идеи прописывать имя процедуры в обработке и заканчивая сторонними утилитами - как-то мутновато, может что-то поразумнее имеется. спасибо

mz-tools всё делают: и номера к строкам добавляют, и сообщение с названием процедуры и названием модуля добавляют.
Я отправляю письмо, сохраняю названия формы и значения контролов, записываю в журнал, делаю скриншот - это удобно и проще, чем потом спрашивать "что вы делали 15-го августа 1993 года" у пользователя :)


добрый день. посмотрел как в MZTOOL все это реализовано, по сути используется объект VBA.ErrObject. При вставке в процедуру банально прописывается "ErrHeader" c Resume или с Goto и в строке информации, то есть в той строке, которая будет выведена на экран, сразу прописывается название процедуры, а для определения номера строки используется ERL. Получается совсем не универсально, то есть если название процедуры изменилось, то строка будет слать совсем не то имя.
    On Error Resume Next

    If Err.Number <> 0 Then
       MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Form_Load, line " & Erl & "."
       Exit Sub
    End If
    On Error GoTo 0

Хотелось бы более универсальную вещь, в принципе, я все это сделал, в том числе процедуры группового обновления, добавления, удаления ErrHandler'ов, расстановку переменных по отдельным строкам, которые были написаны одной строкой, удаление не используемых переменных, удаление, добавление пустых строк в код и т.д.. В общем, такой мини-тюнинг кода через одно нажатие.

Сам хэндлер описал следующим образом:
On Error GoTo Error_Handler 'обработчик ошибок
'====================================

'вставляем нужный код

'======================
Exit_Handler: 'обработчик ошибок
     On Error Resume Next
     Exit Sub
Error_Handler:
     Debug.Print "Номер ошибки: " & Err.Number & ", Описание: " & Err.Description
     Application.VBE.ActiveCodePane.GetSelection glngErrStartLine, glngErrStartCol, glngErrEndLine, glngErrEndCol
     Call prcErrData(Err.Number, Err.Description, Err.Source, Erl, Application.VBE.ActiveCodePane.Window.Caption, _
          Application.VBE.ActiveCodePane.CodeModule.ProcOfLine(glngErrStartLine, vbext_pk_Proc))
     On Error Resume Next
     If lngErrNumber <> 0 Then Call prcОбработкаОшибок
     Resume Exit_Handler
     Resume

то есть после того, как прыгаем на "хэндлер", смотрим строку на которой стоит курсор, находим процедуру в которой она находится и т.д., подсмотрел решение здесь же на форуме. Все хорошо работает, но есть один "косяк", работает только в том случае, если открыт тот CodePane, на котором произошла ошибка, для VBE Active CodePane значит именно тот, который открыт и который в фокусе, а не тот, в котором сейчас исполняется код, если в процессе исполнения не будет открыт ни один CodePane, то же сам обработчик выдаст ошибку, т.к. не сможет обратиться к активному CodePane.
Пересмотрел все известные мне свойства и методы на предмет возможности определения того CodePane или CodeModule, где в данный момент выполняется код, а не который в данный момент активен. К сожалению, пока ничего "умного" не нашел. Но в этом ветке access-спецы пишут, что пишут в лог название процедуры, место ошибки и т.д., стало быть используют либо жесткое закрепление имени процедуры в каждом обработчик (как в примере выше из MZ Tool), либо делают каким-то другим способом, до которого у меня "допетрить" не получается.

Буду признателен за подсказку кто и как фактически делает фиксацию (определение названия) имени процедуры для последующей обработки, например, отправки, логирования, вывода в сообщение.
Может быть мне проще проще немного переписать групповую обработку по добавлению "хэндлеров", чтобы автоматически вместо строки определения процедуры
Application.VBE.ActiveCodePane.GetSelection glngErrStartLine, glngErrStartCol, glngErrEndLine, glngErrEndCol

прописывалась строка с закрепленным именем процедуры и в этом случае вопрос определения имени сам собой отпадет, останется только проблемка при изменении имени процедуры, в этом случае надо будет не забыть поменять имя в "хэндлере"?
23 июн 19, 11:11    [21913539]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
MrShin
Member

Откуда:
Сообщений: 1277
Ганов Александр
кто и как фактически делает фиксацию (определение названия) имени процедуры для последующей обработки

Я тоже много времени убил на поиски, но, похоже, нет такого способа. Если редактор кода не открыт, а тем более если код скомпилирован в accde, определить имя модуля и процедуры нельзя. Поэтому всегда пользуюсь MZTools для вставки имени модуля и процедуры в обработчики ошибок. Им же нумерую строки для Erl. При переименовании/копировании кода в другой модуль заменой меняю имена или перегенерирую обработчики ошибок, много времени это не отнимает.

Настоятельно не рекомендую использовать русские буквы в названиях процедур, на не русских версиях офиса работать не будет с большой вероятностью.
24 июн 19, 16:42    [21914239]     Ответить | Цитировать Сообщить модератору
 Re: отловить ошибку runtime  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 175
MrShin
Настоятельно не рекомендую использовать русские буквы в названиях процедур, на не русских версиях офиса работать не будет с большой вероятностью.

Спасибо за ответ по теме вопроса и за совет - потихоньку отучаюсь :-)
24 июн 19, 20:21    [21914393]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Microsoft Access Ответить