Оператор On Error
всегда очищает переменную Err
(Erl
также сбрасывается в 0). Теоретически это означает, что вы можете решить проблему, переместив оператор On Error
ниже строки ToString = ...
(или вообще убрав обработчик ошибок в функции ToError
), но, к сожалению, это не всегда будет работать.
Каждый компонент (DLL, ActiveX EXE и т. Д.), На который ссылается ваш проект, по существу получает свой собственный экземпляр Err
в памяти. Итак, если ваш MainApp.exe
вызывает ошибку, которая передается в ToError
(например, в отдельном ErrorHandling.dll
), DLL не увидит переменную Err
, которую видит ваш EXE. Каждый из них имеет свои собственные Err
переменные.
Есть как минимум два пути решения проблемы, о которых я могу подумать:
Метод 1
Как упоминает Zian Choy , вы можете добавить дополнительные параметры к вашей ToError
функции, по одному для каждого свойства объекта Err
, к которому вам нужен доступ.
Код
Public Function ToError( _
ByVal strErrSource As String, _
ByVal nErrNumber As Long, _
ByVal sErrDescription As String, _
ByVal nLineNumber As Long) As String
Пример использования
Затем вам нужно будет так вызывать ваши обработчики ошибок, передавая ему все соответствующие значения из текущего объекта Err
вместе с Erl
:
ToError Err.Source, Err.Number, Err.Description, Erl
Если вы также хотите App.Title
, вам придется добавить дополнительный параметр к ToError
для этого, так как App.Title
будет равен App.Title
проекта, где ToError
Метод определен, а не компонент, где возникла ошибка. Это важно, если ToError
находится в другом проекте.
Метод 2
Вы можете сделать свои ToError
вызовы чуть менее многословными, передав сам объект Err
в качестве параметра функции, однако первое, что ваша функция ToError
должна сделать в этом случае, это немедленно сохранить копию все необходимые свойства, так как последующий оператор On Error
очистит переменную.
Код
Public Function ToError(ByVal oError As ErrObject, ByVal nLineNumber As Long) As String
'Copy the important Err properties first, '
'before doing anything else... '
Dim strErrSource As String
Dim nErrNumber As Long
Dim strErrDescription As String
strErrSource = oError.Source
nErrNumber = oError.Number
strErrDescription = oError.Description
On Error Goto errHandle
'More code here
'...
Пример использования
ToError Err, Erl