Visual Basic, .NET, ASP, VBScript
 

   
 

За период изучения данной СУБД мною накоплено большое количество программного кода, советов, трюков и хитростей в создании баз данных средствами MS Access.

 
     
   
 

Как определить имя процедуры, в которой возникла ошибка

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]"

 
     

   
   
     
  VBNet рекомендует