|
|
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Есть у меня обработчик ошибок. Глобальный. А он может как нибудь узнать, в какой строке каког модуля произошла наша ошибка? (мечтательно)Я бы лог завел, все ошибки, которые у клиентов случаются,знал бы. Единственный вариант , который мне попался требовал тотальной ручной нумерации всех строк. Спасибо, я лучше как-нибудь без лога. Кстати, не подскажете, куда в XP делась надстройка про связанные таблицы? Удобно было в 97 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2004, 16:36:42 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Ты нашел наверное оператор Erl (так он помойму называется) - то единственный вариант. В помощь, есть в сети AddIn, которые сами автоматом пробегают по всему твоему коду и нумируют строки, так что проблем, кроме не очень удобного вида, нет. Помойму даже на русьимпорте валялся файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2004, 18:37:09 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Function Erl() As Long Компонент VBA.Information штой-то он скрытный в 97 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2004, 18:57:23 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
А имя модуля? Или строки тотально нумеровать в проекте 8-| ? Тот случай, когда система защиты от сбоев выведет из строя систему:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 07:37:12 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Приведите пож. код, где можно увидеть результат работы функции Erl Я пробовал в процедуре генерить ошибку, но Erl всегда возвращает 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 09:41:44 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Function f1() Dim i1 as integer On error goto lblError 10 i1=1/0 Exit Function lblError: Debug.Print erl() End Function ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:03:53 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. После запуска увидим - Ошибка в строке - 2 Потому что Erl возвращает РАНЕЕ нумерованную строку (представь себе что Erl работает ка счетчик, прошел код нумерованную строку - приобрел значение номера строки, случись ошибка - вернет тот номер, что последним в нем установился). Чтобы всегда получать реальный номер строки, необходимо нумеровать ВСЕ строки, иначе получаешь варианты. В данном примере получаем под цифрой 2 может скрываться ошибка в двух строчках: 2: k = 4 i = k / i ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 10:15:09 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Проще не нумеровать строки, а передавать содержательную информацию в протокол ошибок и если выводиться сообщение пользователю, то можно перехватывать выполнение по Ctrl+Break и по resume next переходить на строку следующую за ошибочной и делать все что хочешь: смотреть значения переменных, исправлять косметически код, возвращать выполнение на оператор, где произошла ошибка, чтобы заново его выполнить. Ведь все это нужно для программиста во время эффективно отладке. А пользователь только видит сообщение об ошибке Err.Description Продолжать? (Да\Нет) и нажимает Да-продолжать дальше, Нет-перейти в конец процедуры. У меня везде, где возможно Private/Public Sub/function NAME1 (...) Dim ... On error goto Er .... Ex: .... Exit sub/function Er: IF (Handler(Err.Number, Err.Description,"NAME1(" & .... & ")") Then Resume Next Else Resume Ex End if End sub/function в отдельном модуле Public function Handler(EN as long, ED as string, Wh as string) as boolean Dim Ans as integer Dim Rst as DAO.Recordset ' -- можно и ADODB on error resume next Set Rst = currentdb.openrecordset("History",,dbAppendOnly) '-- для DAO ' Rst.open "History",CurrentProject.Connection '-- для ADODB Rst.addnew Rst!ErrNumb = EN Rst!ErrDesc = ED Rst!Wheres = Wh Rst!Whens = now() Rst!Who = curruser() '-- ваша функция возвращает имя текущего пользователя Rst.update Set Rst = nothing Handler = (Msgbox(Err.Number & ", " & Err.Description & vbcrlf _ & "Продолжать?", vbYesNo) = vbYes) End function ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 11:18:31 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
спасибо, а без нумерации строк никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 12:23:33 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Вот я как раз и предлагаю без нумерации. Пользователь если видит ошибку - жмет Да (Продолжать) некоторые ошибки ему можно даже не выводить, а автоматом писать в лог и направлять Resume Next или Resume Ex. В логе все будет. Можно проверить у себя и перехватить Ctrl+Break'ом или когда появиться у пользователя трудно находимая ошибка, то попросить его ничего не нажимать и позвать Вас. И Вы у него по Ctrl+Break (если есть у него права на просмотр кода) посмотрите, что в переменных. А номер строки ничего особенного не даст! Кроме статистики ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 18:30:31 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
>позвать Вас >номер строки ничего особенного не даст >смайлик Уважаемый neal. Я не придумал, как цензурно Вам ответить. Вы порете какую-то дикую чушь. Вы понятия не имеете о вопросе, который пытаетесь обсуждать. Вот. Пользователь, изучающий значения переменных. Нет, ЛП прав. Даешь раздел "Юмор" на сайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 20:07:24 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
ПРОЩЕ не нумеровать строки, а сформировать содержательную информацию, те написать для КАЖДОЙ строки индивидуальный обработчик. Что касается моего визита к клиенту для анализа ашипки:-) Новоуренгойский будет ждать особенно долго:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 21:09:14 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
2 Shark Вот и у меня таже проблема, клиенты удалённые, а ошибки нет, нет да проскакивают. Думал может возможно как-то определять строку, на которой вывалилась прога, но видимо нет. Лог веду, но он может дать только инфу о том, какая процедура вылетела. По поводу "написать для КАЖДОЙ строки индивидуальный обработчик." немного не понял, это что - ирония? Как можно для кажой строки написать обработчик? Или такое встречается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 21:22:41 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
>Ирония Конечно. Я позицию neal сформулировал, сгоряча кавычки забыл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 21:55:10 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
ИМХО, neal прав на все 100%. Лично я бы подписался практически под каждым его словом... Shark, Вы просто не совсем верно поняли одну из фраз, на которую отреагировали следующим образом: "Пользователь, изучающий значения переменных." По-видимому, имелось в виду, что именно программер придет и будет смотреть переменные. При удаленном сопровождении этот вариант, конечно, не рассматривается. Теперь непосредственно по сабжу. На самом деле мне, как и любому другому программисту, в большинстве случаев (хотя, конечно бывают и исключения) достаточно иметь информацию о процедуре и значениях входных параметров, при которых произошла ошибка. Имея эту информацию я могу воссоздать у себя подобную ситуацию и увидеть своими глазками строку, в которой произошла ошибка. А что дает номер строки, если мы не знаем входных параметров процедуры? Да ничего! Ну произошла такая-то ошибка в такой-то строке. Ну и что? Какая здесь полезная информация? Да, конечно, при варианте, когда в момент ошибки необходимо запоминать входные или какие-либо "сопричастные" параметры появляется много дополнительной работы "ручками", когда в обработчике необходимо указать, что вот такие-то параметры надо записать в лог-файл, но несомненная выгода в этом есть. Вот кусок из лог-файла ошибок: ____27.03.04 (21:13:50)______CodeDeveloper: IvanScar______ Error : #10001 + vbObjectError (-2147211503) (Нарушена логическая целостность системных данных) Error Source: Help Source: KUBGridHelp.hlp (Context: 10) Error Code : KscKUBGrid.SysFixGridSettingData (C:\Системные Решения\Mdb\KUBGridLib.mdb) Parametrs : 0; 127; Machine/User: Unknown/Unknown (Informed about error: True) Из этого сообщения я могу узнать: - когда и в какое время произошла ошибка; - кто писал данный участок кода; - какая ошибка (ее код и описание) и где (модуль, функция, файл) произошли; - какие параметры были на входе процедуры (первый равен нулю, второй - 127); - на какой машине и во время работы какого пользователя произошла ошибка и был ли этот самый пользователь проинформирован о возникновении исключения. Имея все эти данные на руках, я во-первых, могу передать данное сообщение об ошибке тому кодеру, который ваял этот участок кода. Во-вторых, я могу воссоздать ситуацию и пройти в пошаговом режиме по проблемной процедуре (или просто проанализировать код). В-третьих, я получаю инфу о машине и пользователе, которые сами по себе могут быть "проблемными", и о том, были ли напуганы юзеры. Ну т.е., строку с инструкцией, в которой произошла ошибка, вокруг чего здесь ломают копья, мне не нужна! Я сам ее найду, если буду иметь на руках входные и может быть какие-либо другие параметры... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2004, 23:03:42 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
2Shark ПРОЩЕ не нумеровать строки, а сформировать содержательную информацию, те написать для КАЖДОЙ строки индивидуальный обработчик. Что касается моего визита к клиенту для анализа ашипки:-) Чего кипятишься - разберись сначала. Специально выделяю красным - там ты формируешь строку со значениями входных параметров или важных локальных переменных, по которым ты и сможешь понять из-за чего ошибка произошла и где. (Например, значение переменной цикла скажет на какой итерации произошла ошибка, а не только номер строки как у тебя.) Private/Public Sub/function NAME1 (...) Dim ... On error goto Er .... Ex: .... Exit sub/function Er: IF (Handler(Err.Number, Err.Description,"NAME1(" & .... & ")") Then Resume Next Else Resume Ex End if End sub/function в отдельном модуле Public function Handler(EN as long, ED as string, Wh as string) as boolean Dim Ans as integer Dim Rst as DAO.Recordset ' -- можно и ADODB on error resume next Set Rst = currentdb.openrecordset("History",,dbAppendOnly) '-- для DAO ' Rst.open "History",CurrentProject.Connection '-- для ADODB Rst.addnew Rst!ErrNumb = EN Rst!ErrDesc = ED Rst!Wheres = Wh Rst!Whens = now() Rst!Who = curruser() '-- ваша функция возвращает имя текущего пользователя Rst.update Set Rst = nothing Handler = (Msgbox(Err.Number & ", " & Err.Description & vbcrlf _ & "Продолжать?", vbYesNo) = vbYes) End function И потом если клиент удаленный - то чем подробнее строка Wh, тем легче потом воссоздать у себя на тестовой версии эту ситуацию. 2 Shark Будешь выражаться нецензурно - никто помогать тебе не будет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2004, 15:17:13 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
2 Exquisite 2 neal Это конечно всё хорошо. В проблемных местах всё так и делается, НО есть программа (обычный mdb, файл-сервер), есть удалённые клиенты, которые работают со своими данными, есть бизнес логика, причём одна функция делает в транзакции много всяких вещей. Оттестировал у себя программу. Всё работает на ура. Передаю клиенту – один из умников научился вести прямую запись в таблицы, в результате твои бизнес правила не работают, программа вылетает в совершенно неожиданных местах (причём ты не знаешь, на какой конкретно строке в цепочке транзакций она вылетает). Данные (для того, что бы ты у себя потестировал) тебе конечно же никто не даст, а скажут, что твоя программа глючит и тому подобное. Так что в некоторых случаях полезно знать номер строки, на которой споткнулась программа. Ещё один реальный случай: у клиента стоит оригинальный WinXP и OfficceXP, я у себя делаю на локализованной версии. При отправке очередного обновления (фактически файла БД) я делаю полный импорт всех объектов в новый mdb файл. Совсем недавно у клиента прога начала ругаться в совершенно непроблемном месте. Путём часового разговора по аське, с помощью брикпоинтов удалось найти причину. Но на это у меня ушёл 1 час. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2004, 21:01:56 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
AlTis, конечно, случаи бывают разные и каждый волен (если это, конечно, не командная работа) выбирать одно или сразу несколько решений поставленной задачи. На этом, вобщем-то, можно было бы и закончить :) НО... Но лично я (и это всего лишь мое мнение, мой стиль программирования, который я, конечно, никому не навязываю) в особенно ответственных местах, например в коде, реализующем бизнес-логику, ни за что не доверюсь некому мифическому номеру строки. Все исключительно на "генерации ошибок". Т.е. сложная, "много-ходовая" бизнес-транзакция разбивается на отдельные "проводки", каждая из которых реализована в своей функции, которая, в свою очередь, умеет справляться с возникающими ошибками или абсолютно информативно (что, где, по какой возможной причине) сообщать о возникшей ошибке как мне (через лог-файл), так и вызвавшему ("старшему" в иерархии транзакции) коду, который со временем (после каждой неожиданной ошибки обычно ведь вносятся изменения в программу, способные эту ошибку правильно обработать) становится довольно "интеллектуальным" и кое-что в бизнес-данных способен либо поправить самостоятельно, либо в диалоге с пользователем. Кроеме того, абсолютное большинство ошибок, о которых мне сообщает приложение "придуманы" мной, а не MS! Т.е. ошибки типа "Деление на ноль" или "Тайп мисматч" практически никогда не попадают в лог-файл ошибок, ибо вместо них обработчики ошибок загоняют некую более полезную информацию в контексте выполняемой задачи. Например, в моем предыдущем посте сообщение об ошибке выглядит как "Нарушена логическая целостность системных данных", хотя, на самом деле, произошла (или даже НЕ произошла, а просто была логически "вычеслена") некая другая ошибка, и вот на основе данной ошибки мой "интеллектуальный" код запускает отдельную процедуру, которая "шерстит" эти самые "системные данные", пытаясь их исправить - либо исправляет некорректные данные значениями по умолчанию, либо спрашивает у юзера, либо лезет в архив. Положиться в данном случае на номер строки я не могу, ибо... хм... зыбко как-то... Еще раз замечу, что в принципе, все это дело вкуса... Единственное, что могу настоятельно посоветовать тем, кто формирует свой стиль обработки ошибок: Все функции и процедуры, каким-либо боком связанные с обработкой неожиданных ошибок (некий диалог с пользователем, запись в лог, "аварийно-интеллектуальный" код и т.п.) выносите в отдельный модуль, к которому обращайтесь (к его переменным или функциям) только в случае возникновения ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2004, 23:32:54 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
> Я неблагодарный SergeySV мне очень хорошо ответил. Я его поблагодарил. Но Вы ответили в стиле "А нафиг тебе это ваще?" Я и отреагировал соответственно. МНЕ НАДО. >На самом деле мне, как и любому другому программисту, в большинстве случаев (хотя, конечно бывают и исключения) достаточно иметь информацию о процедуре и значениях входных параметров, при которых произошла ошибка. Для этого придется при ошибке записать в лог снимок БД:-) В большинстве случаев, как раз, ошибка не воспроизведется (но бывают и исключения) >только номер строки как у тебя У меня где- то написано, что я пишу только номер строки? >случаи бывают разные и каждый волен Это правда. Например случай Неал, когда из проекта(если его можно так назвать) даже не выброшены исходники, и предполагается, что автора можно позвать, и для этого даже специальная кнопка в обработчике ошибок. Мне кажется, что для этого "другого" случая ваще не надо никаких обработчиков, тк стандартный эксесный+прибегающий автор дают лучшую функциональность. Впрочем, заканчиваю пилить опилки:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2004, 07:45:25 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Shark> Но Вы ответили в стиле "А нафиг тебе это ваще?" Я и отреагировал соответственно. МНЕ НАДО. МНЕ НАДО? Хм... А как же на счет вот этого: gorobets dima: Короче есть вариант когда нужно сгруппировать все 3 таблицы. Shark: Заведи одну табличку и не парься. Человеку тоже было надо!* Shark> Для этого придется при ошибке записать в лог снимок БД:-) В большинстве случаев, как раз, ошибка не воспроизведется (но бывают и исключения) Возможно, у Вас всё именно так и происходит - все ошибки которые возникают, основаны на содержимом БД. Я не хочу озвучивать свои выводы о получаемых в результате проектах, а просто приведу статистику из своей практики. Львиная часть времени и "кода" лично у меня и моих знакомых программистов уходит на интерфейс и различные "сервисы". В большинстве своем этим самым "интерфейсам" и "сервисам" абсолютно безразлично, какие данные отображать. Ну а к "движкам данных" вообще подход особый.** Shark> У меня где-то написано, что я пишу только номер строки? Перечитывать не буду, ибо здесь не форум лингвистов или писателей-литераторов. Т.е. я "читаю" мысли, а не слова. И если слов таких небыло, то конечно извиняюсь, был не прав. Shark> Это правда. Например случай Неал, когда из проекта (если его можно так назвать) даже не выброшены исходники , и предполагается, что автора можно позвать, и для этого даже специальная кнопка в обработчике ошибок. Ндаааааа... AlTis, который вообще напару с клиентом по аське искал ошибку методом пошаговой отладки вообще полный .... хм... ??? Да? А ведь он в данном топике Ваш союзник, вроде как :) Круто вы даже со своими сторонниками обходитесь...*** Shark> Мне кажется, что для этого "другого" случая ваще не надо никаких обработчиков, тк стандартный эксесный+прибегающий автор дают лучшую функциональность. Браво! БРА-ВО!!! //Никаких комментариев...**** Shark> Впрочем, заканчиваю пилить опилки:-) 100% за! :) //отвалился с темы... -------------------- Примечания: * - возможно развитие темы до 20 строк текста. ** - по поводу "движка данных" уже была представлена информация, при этом возможно практически безграничное развитие темы с приведением мнения супер-авторитетных спецов (путем цитирования их книг, статей и других трудов); *** - непредоставление исходников удаленному клиенту (в случаях с некоробочными продуктами) вообще отдельная тема, которую, боюсь, обсуждать бессмыслено по ряду причин. **** - просто никаких комментариев, ибо если этого не понятно вот просто так без объяснений, то объяснить будет невозможно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2004, 13:40:03 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Мне нужно что-то похожее на обсуждаемый в теме регистратор, но для отлавливания СИСТЕМНЫХ ошибок (т.е. ошибок вида: "программа выполнила недопустимую ошибку и будет закрыта"). А именно: Есть программа, периодически завершающаяся у пользователей (но далеко не всегда) именно таким сообщением. (Проблема обостряется в отчетные периоды - т.е. периоды массовой работы с несколькими специфическими формами). Надо выловить момент (строку кода, или сопутствующие состояние объектов/данных), вызывающий этот нефиксируемый трабл. Пока просто написал через каждую строчку подозрительной процедуры (точнее - одной из) вызов некой спецпроцедуры, делающей запись в табличку с данными информативной строки (по завершении "логируемой" (исследуемой на вшивость) процедуры все внесенные ею изменения либо удаляются - "рабочий режим" лога - чтобы не раздувался (итого, остаются только те записи, для которых "конец процедуры не наступил из-за выгрузки приложения или просто необработанной ошибки (правда этих быть не должно)), либо меняют флаг завершения - "режим жесткой отладки" (слежу глазом за тем, как все проходит в "штатном" режиме" (порядок следования записей логов нескольких вызывающих друг друга, в т.ч. неявно, процедур) + если надо анализировать и возможность влияния деятельности других юзеров - чтобы их "штатно завершившиеся процедуры" не вытирали свой "одновременный" лог). Что удивительно - обнаружил, что "вылет" чаще всего происходит на вызове "стандартной" ф-ии IsLosded() (Правда из очень древней реализации). Но, думается, в самой форме, которая ИзЛоадед, может (перед падением) висеть несохраненная запись, которая, в свою очередь, может (при попытке потрогать форму) вызывать обработчик BeforeUpdate формы, (а там еще много чего понакручено-понаворочено - вплоть до проверки прав на изменение данных (от времени), выдачи боксов и т.п. Мои пляски с бубнами - вроде явного объявления типов, в т.ч. возвращаемых функций, правки обработчиков ошибок (не мною все писано) и т.п. ощутимого результата не приносят.) Вот и думай - то ли вписывать строки - "регистрилку лога" по всей мыслимой цепочке (т.е. практически после каждого оператора, к тому же меняя в них строки с инфой), то ли искать другой способ "получения знаний". Кто что-то мыслил/делал по проблеме - просьба поделится идеями/наработками. Межмордие - Аксесс 97. mde. Данные - .mdb формата Access 2.0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2004, 15:52:57 |
|
||
|
Обработчик ошибок
|
|||
|---|---|---|---|
|
#18+
Что-тот я только прочел спор............ окончательный вариант все же какой? есть ли пути глобального перехвата события ошибок на уровне приложения Access без трассировки всего кода на msgbox err.description? Проставить то все можно разве по Access.errors.count нельзя определить err.description в крнце после выхода из приложения...........вот по поводу строчек кода................. http://]http://www.sql.ru/forum/actualthread.aspx?tid=151530 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2005, 15:10:46 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32543846&tid=1669307]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 189ms |
| total: | 292ms |

| 0 / 0 |
