Программирование в IIS

Обработка ошибок


Взаимодействие с базой данных выводит нас на новый уровень сложности приложения, для которого требуется большая надежность в критических ситуациях. Корректная поддержка ошибок является необходимым условием реализации любого кода; она должна обрабатывать ситуации, которые вызывают возникновение ошибки в подпрограмме, например, при взаимодействии с пользователем или при соединении с разнородными системами.

В Visual Basic имеется система обработки ошибок, легкая в использовании и управлении. Отсутствие обработки ошибок распространяется и на программу-потребителя. В этом случае пользователь видит малоинформативное сообщение, и программа прерывает свою работу. В веб-приложении, где COM-объект используется страницей ASP, конечному пользователю отображается сообщение об ошибке, если IIS настроен на показ таких сообщений.

Каждая исключительная ситуация, имеющая место в классе clsChair, фиксируется в журнале событий и сохраняется в локальной переменной свойства ChairError. Код написан таким образом, что при получении информации об ошибке приостанавливается его работа. Обработка ошибок в классе clsChair реализована с использованием той же базовой технологии во всех функциях и подпрограммах. Обработчик ошибок устанавливается на входе в функцию или подпрограмму для перехода к определенной строке. Указываются две строки, определяющие стратегию выхода при обработке ошибок: sub_Exit_Done и sub_Error_Handler. Строка sub_Error_Handler представляет стратегию, согласно которой действия осуществляются при возникновении исключительных условий, указанных в выражении On Error. Код, следующий за строкой sub_Exit_Done, представляет собой обычную стратегию выхода функции или подпрограммы, если при работе программы не возникают исключительные ситуации. В листинге 1.5 приведена типовая структура системы обработки ошибок, примененная в классе clsClass.

Листинг 1.5.

(html, txt)

Подпрограмма ProcessErr, вызываемая в рамках стратегии обработки исключительных условий, обрабатывает ошибки VB или другие неверные условия. ProcessErr выполняет следующие действия:

  • фиксирует информацию об ошибках в журнале событий Windows для дальнейшего анализа;
  • записывает ошибки в локальную переменную класса для доступа к ней программы-потребителя.

Журнала не будет заполняться до тех пор, пока компонент не будет скомпилирован, по причине ограничения VB и мер безопасности Windows. При выполнении компонента в VB IDE журналы событий не ведутся.

В листинге 1.6 приведен код подпрограммы ProcessErr.

Листинг 1.6. ProcessErr Subroutine – Error Logger and Formatting (html, txt)

ProcessErr записывает время и добавляет его к описанию ошибки. Свойства класса VB Err конкатенируются в строку, которая станет частью сообщения об ошибке, фиксируемого и сохраняемого в локальной переменной ошибки.


'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return success value

On Error Resume Next 'destroy objects Exit Function

Sub_Error_Handler: ProcessErr " message about the failure in terms of function"

Листинг 1.5.

Подпрограмма ProcessErr, вызываемая в рамках стратегии обработки исключительных условий, обрабатывает ошибки VB или другие неверные условия. ProcessErr выполняет следующие действия:

  • фиксирует информацию об ошибках в журнале событий Windows для дальнейшего анализа;
  • записывает ошибки в локальную переменную класса для доступа к ней программы-потребителя.


Журнала не будет заполняться до тех пор, пока компонент не будет скомпилирован, по причине ограничения VB и мер безопасности Windows. При выполнении компонента в VB IDE журналы событий не ведутся.

В листинге 1.6 приведен код подпрограммы ProcessErr.

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'ProcessErr 'formats error and stores it in error local 'then write to event log. Event logging 'will not function in IDE - only in compiled. ' 'in: vsMessage - usually denoting function 'out: nothing '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private Sub ProcessErr(ByVal vsMessage As String)

Const ERROR_SEPARATOR = " -- " Const NOW_TIME_FORMAT = "yyyy mmm d hh:mm:ss" Const A_SPACE = " " Const ERROR_NUM = " Error #" Const ERROR_BY = " was generated by "

Dim sDateTime As String

'get a time data stamp sDateTime = CStr(Format(Now, NOW_TIME_FORMAT)) & _ ERROR_SEPARATOR

'construct the error entry vsMessage = sDateTime & vsMessage

'add err object data to the error entry m_sErrorMessage = vsMessage & ERROR_NUM & Err.Number _ & ERROR_BY & Err.Source & A_SPACE & Err.Description & vbCrLf

'write to event log App.LogEvent m_sErrorMessage, vbLogEventTypeError

End Sub

Листинг 1.6. ProcessErr Subroutine – Error Logger and Formatting

ProcessErr записывает время и добавляет его к описанию ошибки. Свойства класса VB Err конкатенируются в строку, которая станет частью сообщения об ошибке, фиксируемого и сохраняемого в локальной переменной ошибки.


Содержание раздела