Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / отловить ошибку runtime / 25 сообщений из 60, страница 1 из 3
09.02.2019, 16:29
    #39771593
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
добрый день знатокам и начинающим. заинтересовал один момент с обработкой ошибок
использую обычный обработчик ошибок

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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 то самое описание, которое дает штатное окно ошибок, чтобы не забивать голову что же случилось и почему не делается то, что надо?

Заранее благодарю за подсказку
...
Рейтинг: 0 / 0
11.02.2019, 10:55
    #39772069
отловить ошибку runtime
Ганов Александр, описание ошибки доступа к данным нужно получать методом AccessError.
...
Рейтинг: 0 / 0
11.02.2019, 12:24
    #39772145
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
Кривцов Анатолий, принято. благодарю за "наводку". уже открыл справку, изучу вопрос. очень хочется, чтобы не только отлавливало, но и в доступной форме поясняло суть ошибки
...
Рейтинг: 0 / 0
11.02.2019, 13:27
    #39772196
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
Ганов Александр,

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



On Error Resume Next всегда сбрасывает ошибку, у вас после него всегда Err.Number = 0 и Err.Description пустое.
Не нужна эта команда.
...
Рейтинг: 0 / 0
11.02.2019, 13:50
    #39772225
отловить ошибку runtime
MrShinOn Error Resume Next всегда сбрасывает ошибку, у вас после него всегда Err.Number = 0 и Err.Description пустое.
Не нужна эта команда. Вы ошибаетесь. Не сбрасывается. Сбросить можно методом Err.Clear, если Err <> 0.
А команда действительно не нужна, как и все, что выделено ниже.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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
...
Рейтинг: 0 / 0
11.02.2019, 14:16
    #39772251
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
Кривцов Анатолий, честно говоря, я его не сам придумал, а почерпнул в книге "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-м авторам книги, поэтому я доверился тому, что указано в книге
...
Рейтинг: 0 / 0
11.02.2019, 14:16
    #39772252
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
...
Рейтинг: 0 / 0
11.02.2019, 14:48
    #39772277
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
Кривцов АнатолийВы ошибаетесь. Не сбрасывается
Не соглашусь. Проэкспериментируйте.
...
Рейтинг: 0 / 0
11.02.2019, 14:49
    #39772280
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
...
Рейтинг: 0 / 0
11.02.2019, 14:53
    #39772281
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
MrShinOn Error Resume Next всегда сбрасывает ошибку, у вас после него всегда Err.Number = 0 и Err.Description пустое.
Не нужна эта команда.
насколько я понимаю номер и описание ошибки будет сохранено до тех пор покуда не возникнет новая ошибка или не кончится процедура или функция. и, судя по всему, авторы книги перестраховываются и именно поэтому вставляют еще по одному Resume Next в обработчик ошибок и в процедуру выхода, т.к. если случится ошибка именно в этих местах, то она заменит описание той ошибки, которая инициировала цепочку всех событий и вызвала обработчик ошибок. не знаю конечно что такое может случиться уже в самом хендлере ошибок, но т.к. у авторов книги наверняка не малый опыт чтобы "накатать" книгу на 1230 стр., то я сделал так как написано
...
Рейтинг: 0 / 0
11.02.2019, 15:05
    #39772286
отловить ошибку runtime
MrShinКривцов АнатолийВы ошибаетесь. Не сбрасывается
Не соглашусь. Проэкспериментируйте. Перед своим постом провел самоконтроль.
Код: vbnet
1.
2.
3.
4.
On Error Resume Next
Dim a&
    a = 1 / 0
    MsgBox Err.Number & "  " & Err.Description

Выдает "11 Devision by 0"
А так сбрасывает уже существующую ошибку.
Код: vbnet
1.
2.
3.
4.
5.
On Error Resume Next
Dim a&
    a = 1 / 0
On Error Resume Next
    MsgBox Err.Number & "  " & Err.Description

Но это как-то коряво, что ли. И да, у ТС это тот случай, согласен.

А вот про "последний Resume" я не знал. Теперь знаю.
...
Рейтинг: 0 / 0
11.02.2019, 15:20
    #39772302
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
Кривцов АнатолийПеред своим постом провел самоконтроль.
Не понял. Последний вариант у меня выдает 0 и пустоту, как и ожидалось. У вас выдает текст ошибки??? Может это в старых версиях такая особенность? У меня 2010, все сбрасывается, более ранней версии нет для проверки.

Кривцов АнатолийА вот про "последний Resume" я не знал. Теперь знаю
Я сам постоянно использую Resume, который никогда не выполняется - для отладки. Только в описании пропущен момент, что на Resume надо сначала перевести курсор выполнения с помощью Ctrl-F9, только потом жать F8
...
Рейтинг: 0 / 0
11.02.2019, 15:21
    #39772303
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
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 уже в самом обработчике ошибок
...
Рейтинг: 0 / 0
11.02.2019, 15:24
    #39772307
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
авторЯ сам постоянно использую Resume, который никогда не выполняется - для отладки. Только в описании пропущен момент, что на Resume надо сначала перевести курсор выполнения с помощью Ctrl-F9, только потом жать F8
я просто сказал про мышку, можно и через CTRL+F9
авторберем двигаем ее мышкой вниз на Resume
тут кому как удобнее
...
Рейтинг: 0 / 0
11.02.2019, 15:34
    #39772312
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
Ганов Александрпроверял обработчик по шагам
Какая у вас версия Акцесса?
...
Рейтинг: 0 / 0
11.02.2019, 15:36
    #39772315
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
В вашем случае второй On Error Resume Next не нужен однозначно. Там негде возникнуть ошибке, если prcОбработкаОшибок содержит нормальный обработчик ошибок и он не поднимает ошибку наверх принудительно.
...
Рейтинг: 0 / 0
11.02.2019, 15:39
    #39772318
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
MrShin, 2016
...
Рейтинг: 0 / 0
11.02.2019, 15:40
    #39772319
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
MrShinВ вашем случае второй On Error Resume Next не нужен однозначно. Там негде возникнуть ошибке, если prcОбработкаОшибок содержит нормальный обработчик ошибок и он не поднимает ошибку наверх принудительно.
согласен
...
Рейтинг: 0 / 0
11.02.2019, 15:43
    #39772323
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
Ганов Александр2016
Ничего не понимаю. Попробовал в 2016 - то же самое, сбрасывается. Как такое возможно???
...
Рейтинг: 0 / 0
11.02.2019, 15:47
    #39772329
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
MrShin, не могу знать к сожалению, у меня 100% работает. проверял не раз когда тестировал и ошибки когда случаются показывает все как надо
...
Рейтинг: 0 / 0
11.02.2019, 15:56
    #39772338
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
Ганов Александру меня 100% работает
Тем не менее я бы не рекомендовал использовать это. Видимо, есть какие-то особенности, нужно выяснять. Тем более я привел ссылку из книги, которая подтверждает такое поведение.
...
Рейтинг: 0 / 0
11.02.2019, 16:46
    #39772379
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
MrShin, похоже что я Вас дезинформировал. действительно скидывает. вставил 2 дебага.print до и после Resume Next , второй дебаг показывает любую ошибку как ноль. то есть до Resume Next ошибка есть, после становится ноль
...
Рейтинг: 0 / 0
11.02.2019, 16:50
    #39772382
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
нашел откуда ноги растут - в обработчиках функций у меня в шаблоне MZ Tool нет этой строки, а в обработчике для процедур она есть, судя по всему, я проверял в функции и распространил положительный результат на все обработчики. Получается, что книжка совершенно права, действительно скидывает ошибку. Подправил все дела в базе и в шаблоне. Благодарствую за наблюдательность
...
Рейтинг: 0 / 0
11.02.2019, 16:58
    #39772392
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
Ганов АлександрПодправил все дела в базе и в шаблоне
Так возвращаясь к первоначальному вопросу, заработало как есть после удаления строки или все еще AccessError требуется?
...
Рейтинг: 0 / 0
11.02.2019, 17:15
    #39772407
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отловить ошибку runtime
MrShin, теперь еще более интересно стало. ошибка ловится. но ее размер ее err.number вызывает overflow
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / отловить ошибку runtime / 25 сообщений из 60, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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