Ошибки, возникающие в отладке класса, как если бы они возникали при вызове свойства
Я (к сожалению) разрабатываю приложение в Excel 2000 VBA. Я полагаю, что обнаружил, что любая ошибка, возникающая в свойстве, функции или подпунктах пользовательского класса, как если бы ошибка возникла в той точке кода VBA, где вызывается свойство. То есть отладчик VBE не приводит меня к точке в свойстве Class, где произошла ошибка, а вместо этого, где свойство было впервые введено (например, из Sub-модуля или функции Module). Это расстраивает разработку чего-то большего, чем наиболее мелкий OO Excel 2000 VBA-код, поскольку мне нужно построчно проходить через каждый метод Class, чтобы найти инструкции, вызывающие ошибку.
Я что-то упустил или это известная ошибка, с которой мне приходится сталкиваться в Excel 2000? Это было исправлено в 2003 или 2007 году?
Пример кода:
'''''''''''''''
'In Module1:
Public Sub TestSub1()
Dim testClass As Class1
Dim testVariant As Variant
Set testClass = New Class1
testVariant = testClass.Property1 'Debugger takes me here...
End Sub
''''''''''''''
' In Class1
Property Get Property1() As Variant
Err.Raise 666, , "Excel 2000 VBA Sux!" 'But error is actually thrown here.
End Property
4 ответа
Для Office 2003 вы получите такое поведение, когда отладчик настроен на прерывание при необработанных ошибках (конфигурация по умолчанию).
Если вы хотите, чтобы он ломался в строке Err.Raise, вам необходимо настроить его так, чтобы он ломался во всех ошибках (Инструменты / Параметры / Общие / Перехват ошибок / Разрыв всех ошибок).
Я считаю, что то же самое для Office 2000, но у меня нет копии для проверки.
Эта страница является очень хорошим ресурсом по обработке ошибок в VBA:
Эта "особенность" такая же в Excel 2003, и я был бы удивлен, если она будет отличаться в 2007 году.
То же самое относится и к Excel 2010 - вот где я встретил это поведение.
Цитировать сайт Чипа Пирсона:
Нет абсолютно никакой причины использовать настройку перехвата ошибок, кроме как в модуле взлома классов.
Его описание разницы между режимами ошибок:
Когда вы тестируете и запускаете свой код, у вас есть три режима перехвата ошибок. Во-первых, сломать все ошибки. Это приведет к открытию отладчика, если возникнет какая-либо ошибка, независимо от того, какая обработка On Error у вас может быть в коде. Второй вариант - "Разбить необработанные ошибки". Это приведет к открытию отладчика, если ошибка не обрабатывается существующей директивой On Error. Это наиболее часто используемая опция и настройка по умолчанию. Третий вариант, Break In Class Module, является наиболее важным и наименее используемым. Это не режим захвата ошибок по умолчанию, поэтому вы должны установить его вручную.
Модуль Break In Class является наиболее важным, потому что он заставит отладчик разбить строку кода в объектном модуле, который фактически вызывает проблему. Параметр Break In Class Module находится в диалоговом окне "Параметры", доступном в меню "Инструменты". Он находится на вкладке "Общие" диалогового окна "Параметры", как показано ниже.