Скопление ошибок в основную процедуру - PullRequest
4 голосов
/ 26 августа 2009

Если у меня есть основная процедура с обработкой ошибок, которая вызывает другие процедуры без обработки ошибок, должны ли ошибки сворачиваться до основной процедуры?

Что если процедуры без обработки ошибок используют функции без обработки ошибок?

Должно ли все сводиться к обработке ошибок основной процедуры?

Ответы [ 3 ]

7 голосов
/ 26 августа 2009

Да, необработанные ошибки свернут стек. Если у вас нет обработки ошибок в вашей основной подпрограмме (или в текущей подпрограмме обработки событий), тогда ошибка будет свернута до самого VBA, что приведет к прерыванию работы вашей программы или сбросу среды VBA в приложении хоста. , (ты не хочешь этого).


Я могу придумать два очевидных исключения из этого: одно иллюзорное и одно реальное:

1) Если VBA вводится через непредвиденный путь события, вместо основной процедуры может показаться, что ваш обработчик ошибок основных подпрограмм обходит возврат ошибки, но на самом деле это другой поток поэтому, когда он сворачивается из обработчика событий, он отправляется в VBA независимо от основного потока вашей основной процедуры.

2) Обработка ошибок VBA не может перехватить ВСЕ ошибки, в частности, большинство ошибок FATAL не может быть перехвачено им и приводит к сбою (и сбросу) всей среды VBA. Например, ошибки переполнения стека.

2 голосов
/ 26 августа 2009

Процедура A с обработкой ошибок перехватит все ошибки. Процедура B без обработки ошибок не поймает ни одного.

Если A вызывает B и B имеет ошибку, она свернется и попадет в обработчик A.
Если B вызывает A и B имеет ошибку, обработка не будет.
Если B вызывает A и A имеет ошибку, A ее поймает.

Не имеет значения, функция это или процедура. Однако стоит отметить, что модуль класса не будет обрабатывать ошибки локально, а передает их обратно в стек первому неклассовому модулю.

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

1 голос
/ 14 января 2011

Ошибки, не обработанные локально, всегда * будут захвачены обработчиком ошибок верхнего уровня, если для параметра перехвата ошибок установлено значение "Разрыв по необработанным ошибкам". Вы найдете этот параметр в IDE в разделе «Параметры инструментов».

Если установлено «Разорвать все ошибки», обработчик ошибок (ни локальный, ни стек) не будет вызываться. Если для него установлено значение «Break in Class Module», то для ошибки в классе не будет вызываться внеплановый обработчик ошибок.

Обратите внимание, что этот параметр изменяет строку, на которой останавливается отладчик: при возникновении необработанной ошибки в модуле класса, отладчик останавливается на строке, вызывающей класс с «Break on Unhandled Errors», или на ошибочной строке в классе с "Break in Class Module".

В Access эта опция может быть прочитана программно с помощью Application.GetOption («Перехват ошибок») и Application.SetOption («Перехват ошибок»).

* Как пишет RBarryYoung, наиболее фатальные ошибки (например, ошибки переполнения стека) не будут обнаружены обработкой ошибок VBA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...