2009-08-26 3 views
4

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

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

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

ответ

7

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


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

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

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

+0

Спасибо за ответ. Это то, что я думал, и это, похоже, в 99% случаев. Но время от времени функция будет иметь ошибку, и вместо того, чтобы свернуться, я получаю окно ошибки VBA (с отладкой и т. Д.). Я не понимаю, почему. – 2009-08-26 16:58:06

+1

Мне нужен более конкретный пример для комментариев. – RBarryYoung

+0

Ооо! +1 для дополнительных объяснений («2 кажущихся исключения»). – Smandoli

2

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

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

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

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

+0

Если у вас странное поведение, было бы неплохо опубликовать странный код (с его частями обработки ошибок) и указать, какие ошибки не обрабатываются правильно. – Smandoli

1

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

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

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

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

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

Смежные вопросы