Хорошие шаблоны для обработки ошибок VBA - PullRequest
70 голосов
/ 24 июня 2009

Каковы хорошие шаблоны для обработки ошибок в VBA?

В частности, что мне делать в этой ситуации:

... some code ...
... some code where an error might occur ...
... some code ...
... some other code where a different error might occur ...
... some other code ...
... some code that must always be run (like a finally block) ...

Я хочу обработать обе ошибки и возобновить выполнение после кода, в котором может возникнуть ошибка. Кроме того, код finally в конце должен ВСЕГДА выполняться - независимо от того, какие исключения вызываются ранее. Как мне достичь этого результата?

Ответы [ 12 ]

2 голосов
/ 14 января 2016

Остерегайтесь ловушки для слонов:

Я не видел упоминаний об этом в этой дискуссии. [Access 2010]

Как ACCESS / VBA обрабатывает ошибки в объектах CLASS, определяется настраиваемым параметром:

Редактор кода VBA> Инструменты> Параметры> Общие> Перехват ошибок:

enter image description here

1 голос
/ 17 декабря 2014

Мой личный взгляд на заявление, сделанное ранее в этой теме:

И просто для удовольствия:

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

Я использую On Error Resume Next для процедур, в которых я не хочу, чтобы ошибка остановила мою работу, и где любое утверждение не зависит от результата предыдущих операторов.

Когда я делаю это, я добавляю глобальную переменную debugModeOn и устанавливаю ее на True. Тогда я использую это так:

If not debugModeOn Then On Error Resume Next

Когда я доставляю свою работу, я устанавливаю переменную в false, таким образом скрывая ошибки только для пользователя и показывая их во время тестирования.

Также использует его при выполнении чего-то, что может привести к сбою, например, вызов DataBodyRange объекта ListObject, который может быть пустым:

On Error Resume Next
Sheet1.ListObjects(1).DataBodyRange.Delete
On Error Goto 0

Вместо:

If Sheet1.ListObjects(1).ListRows.Count > 0 Then 
    Sheet1.ListObjects(1).DataBodyRange.Delete
End If

Или проверка наличия предмета в коллекции:

On Error Resume Next
Err.Clear
Set auxiliarVar = collection(key)

' Check existence (if you try to retrieve a nonexistant key you get error number 5)
exists = (Err.Number <> 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...