Shark
Дата: 01.06.2004 16:36:42
Есть у меня обработчик ошибок.
Глобальный.
А он может как нибудь узнать, в какой строке каког модуля произошла наша ошибка?
(мечтательно)Я бы лог завел, все ошибки, которые у клиентов случаются,знал бы.
Единственный вариант , который мне попался требовал тотальной ручной нумерации всех строк. Спасибо, я лучше как-нибудь без лога.
Кстати, не подскажете, куда в XP делась надстройка про связанные таблицы? Удобно было в 97
Shuhard
Дата: 01.06.2004 18:25:03
SergeySV
Дата: 01.06.2004 18:37:09
Ты нашел наверное оператор Erl (так он помойму называется) -
то единственный вариант. В помощь, есть в сети AddIn, которые сами автоматом пробегают по всему твоему коду и нумируют строки, так что проблем, кроме не очень удобного вида, нет. Помойму даже на русьимпорте валялся файл.
помню помню
Дата: 01.06.2004 18:57:23
Function Erl() As Long
Компонент VBA.Information
штой-то он скрытный в 97
Shark
Дата: 02.06.2004 07:22:07
Спасибо
Shark
Дата: 02.06.2004 07:37:12
А имя модуля? Или строки тотально нумеровать в проекте 8-| ?
Тот случай, когда система защиты от сбоев выведет из строя систему:-)
AlTis
Дата: 02.06.2004 09:41:44
Приведите пож. код, где можно увидеть результат работы функции Erl
Я пробовал в процедуре генерить ошибку, но Erl всегда возвращает 0
Shark
Дата: 02.06.2004 10:03:53
Function f1()
Dim i1 as integer
On error goto lblError
10 i1=1/0
Exit Function
lblError:
Debug.Print erl()
End Function
SergeySV
Дата: 02.06.2004 10:15:09
Public Sub aaa()
Dim i As Long
Dim k As Long
On Error GoTo Er_
1: i = 0
2: k = 4
i = k / i
3: k = i + 1
Ex_:
Exit Sub
Er_:
MsgBox "Ошибка в строке - " & Erl
Resume Ex_
End Sub
|
|
После запуска увидим - Ошибка в строке - 2
Потому что Erl возвращает РАНЕЕ нумерованную строку (представь себе что Erl работает ка счетчик, прошел код нумерованную строку - приобрел значение номера строки, случись ошибка - вернет тот номер, что последним в нем установился). Чтобы всегда получать реальный номер строки, необходимо нумеровать ВСЕ строки, иначе получаешь варианты. В данном примере получаем под цифрой 2 может скрываться ошибка в двух строчках:
2: k = 4
i = k / i
neal
Дата: 02.06.2004 11:18:31
Проще не нумеровать строки, а передавать содержательную информацию в протокол ошибок и если выводиться сообщение пользователю, то можно перехватывать выполнение по 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