Как определить
имя процедуры, в которой возникла ошибка
Author(s)
Dev Ashish
(Q)
Трудно определять, в каких процедурах во
время выполнения программы происходит
ошибка. Есть ли какой-нибудь способ
определять имена вызываемых процедур во
время исполнения программы ?
(A) К сожалению, VBA не
предлагает какого-либо встроенного
свойства/метода для отображения этой
информации. Однако, это можно сделать и
самому. В зависимости от сложности проекта,
Вы даже можете
использовать стек для хранения вызываемых
процедур, как описано в книге Ken
Getz "Access 95 How to", либо
использовать глобальную переменную для
хранения имени текущей процедуры.
К примеру, создайте
следующие переменные в модуле:
Public
pstrProcName as String
Public pstrSubProcName as
String
Теперь в каждой
процедуре, в начале кода, назначьте
соответствующие имена этим переменным.
Переменную pstrSubProcName следует
использовать во время вызова вложенной
процедуры.
'***** Code Start *******
Sub button1_click()
pstrProcName = "button1_click()"
Call
sShowMsg
Msgbox pstrProcName
End sub
Sub sShowMsg()
pstrSubprocName = "sShowMsg"
Msgbox "You are in procedure: " &
pstrSubProcName
End sub
'******** Code End *******
Как Вы видите, если
мы будем использовать только одну
переменную
pstrProcName для хранения
имени исполняемой в данный момент времени
процедуры, то после успешного возвращения
из подпрограммы sShowMsg()
в этой переменной будет содержаться
неверное значение ("sShowMsg"),
поэтому для именования
вложенных процедур и приходится
использовать дополнительную переменную
pstrSubProcName.
Мое
продолжение предложенной идеи:
Кстати
префикс "p" впереди имени переменной -
это сокращенное Public для определения
видимости переменной, "str" - это тип String
переменной. Надо будет опубликовать полную
версию Венгерской системы соглашений об
именовании переменных. Когда привыкаешь к
ней, становится жутко удобно....
хм..... что-то все-таки
простовато
для уровня Dev Ashish,
а если три вложенные процедуры,
что еще переменные плодить ?
Надо еще поискать
упоминаемый алгоритм хранения имен
вызываемых процедур в стеке от Кена Гетца и
опубликовать.
Как известно из
хороших, читай, правильных манер программирования
;), в каждую созданную процедуру необходимо
вставлять перехватчик ошибок - иначе
произойдет ошибка RunTime Error и все Ваше
приложение может рассыпаться прямо на
глазах изумленного пользователя ;)
Так вот, если мы и
так вставляем в каждую процедуру
перехватчик ошибок, то что нам стоит просто
указывать в сообщении об ошибке имя этой
самой процедуры в которой и произошла
ошибка?
Private Sub Кнопка0_Click()
On Error GoTo Кнопка0_Click_Error
Dim
lngTemp As Long
Call sShowMsg
lng Temp = 10 / 0
Exit Sub
Кнопка0_Click_Error:
MsgBox "Неожиданная
ошибка - " & Err.Number & vbCrLf & vbCrLf &
Err.Description,
_
vbExclamation, _
"Модуль формы: Форма1 - Кнопка0_Click"
'вот тут-то в строке заголовка
сообщения об ошибке
'мы и пишем имя текущей
процедуры! А лучше еще написать
'имя модуля, формы, приложения,
да и вообще, все что угодно...
End Sub
Sub sShowMsg()
On Error GoTo sShowMsg_Error
Dim
lng Temp As Long
lng Temp = 10 / 0
Exit Sub
sShowMsg_Error:
MsgBox "Неожиданная ошибка - " & Err.Number & vbCrLf & vbCrLf &
Err.Description, _
vbExclamation, _
"Подпрограмма - SShowMsg модуля формы:
Форма1"
'вот тут-то в строке
заголовка сообщения об ошибке
'мы и пишем имя текущей процедуры! А лучше
еще написать
'имя модуля, формы, приложения,
да и вообще, все что угодно...
End Sub
Поделюсь одним
программерским советом ;) по адресу: http://www.zada.com.au/zservba6.exe
Вы можете скачать программульку Error Handler Builder
Version 2.2.2 (231kb), работающей как Add-Ins для среды
VBA6 (вызывается из IDE командой Add-Ins -> Error-Handler
Builder). Она позволяет создавать по шаблонам и
вставлять в процедуры свои собственные
перехваты ошибок, обладает гибкими
настройками и бесплатна. Экономит время.
Я
использую в ней вот такой простенький
шаблон (просто создайте новый шаблон,
сделайте его используемым по умолчанию, и
вставьте этот текст):
On Error GoTo ErrorHandler
'created [DATE] - [TIME] by [AUTH]
[BODY]
Exit [PRTY]
'----------------------ErrorHandler-------------------------
ErrorHandler:
MsgBox "Ошибка - " & Err.Number & vbCrLf & vbCrLf & Err.Description, vbExclamation, _
"Form: ______ [PRTY]: [FUPN]"