Vba excel on error resume next не работает

Оператор On Error

Включает программу обработки ошибок и указывает местоположение этой программы в процедуре; также может использоваться для отключения программы обработки ошибок.

Синтаксис

On Error GoTo line
On Error Resume Next
On Error GoTo 0

Синтаксис оператора On Error может принимать любую из следующих форм:

Statement Описание
On Error GoTo line Включает процедуру обработки ошибок, которая начинается в строке, указанной в аргументе обязательной строки.

Аргумент line представляет собой любую метку строки или любой номер строки.

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

Указанная строка должна быть в той же процедуре, что и оператор On Error; в противном случае происходит ошибка во время компиляции.

On Error Resume Next Указывает, что при ошибке во время выполнения управление переходит к заявлению сразу после утверждения, где произошла ошибка, и выполнение продолжается. Используйте эту форму вместо On Error GoTo при доступе к объектам.
On Error GoTo 0 Отключает любой включенный обработчик ошибок в текущей процедуре.

Примечания

Если оператор On Error не используется, любая случившаяся ошибка выполнения является неустранимой; то есть в этом случае отображается сообщение об ошибке и выполнение прекращается.

«Включенный» обработчик ошибок — это обработчик, включенный оператором On Error; «активный» обработчик — это включенный обработчик, который находится в процессе обработки ошибки. Если ошибка возникает при активном обработнике ошибок (между возникновением ошибки и возобновлением, выходом sub, exit function или exit Property statement), обработник ошибки текущей процедуры не может справиться с ошибкой. Управление возвращается к вызывающей процедуре.

Если вызывающая процедура содержит включенный обработчик ошибок, он активируется для обработки ошибки. Если обработчик ошибок вызывающей процедуры также активный, управление передается обратно через предыдущие вызывающие процедуры до тех пор, пока не будет найден включенный, но неактивный обработчик. Если не удается найти неактивный включенный обработчик ошибок, ошибка является неустранимой в той точке, в которой она фактически произошла.

Каждый раз, когда обработчик ошибок передает управление обратно вызывающей процедуре, эта процедура становится текущей процедурой. После обработки ошибки обработчивем ошибки в любой процедуре, выполнение возобновляется в текущей процедуре в точке, указанной в заявлении Resume.

Процедура обработки ошибок не является процедурой Sub или Функцией. Это фрагмент кода, отмеченный меткой строки или номером строки.

Процедуры обработки ошибок зависят от значения в свойстве Номер объекта Err для определения причины ошибки. Программа обработки ошибок должна проверить или сохранить соответствующие значения свойства в объекте Err, прежде чем может произойти любая другая ошибка или прежде чем будет вызвана процедура, которая может вызвать ошибку. Значения свойства в объекте Err отражают только самую последнюю ошибку. Сообщение об ошибке, связанное с Err.Number, содержится в Err.Description.

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

При обработке ошибок, возникающих при обращении к другим объектам, конструкция On Error Resume Next предпочтительнее, чем On Error GoTo. Проверка объекта Err после каждого взаимодействия с объектом позволяет устранить неоднозначность в плане того, к какому объекту обращался код. Вы можете точно определить, какой объект поместил код ошибки в свойство Err.Number, а также какой объект изначально сгенерировал ошибку (объект, указанный в свойстве Err.Source).

Оператор On Error GoTo 0 отключает обработку ошибок в текущей процедуре. Он не указывает строку 0 в качестве начала кода обработки ошибки, даже если процедура содержит строку с номером 0. Без оператора On Error GoTo 0 обработчик ошибок автоматически отключается, когда выполняется выход из процедуры.

Чтобы не допустить выполнения кода обработки ошибки, когда ошибка не произошла, поместите оператор Exit Sub, Exit Function или Exit Property непосредственно перед программой обработки ошибок, как показано в следующем фрагменте:

Здесь код обработки ошибок следует заявлению Exit Sub и предшествует заявлению End Sub, чтобы отделить его от потока процедуры. Код обработки ошибок может помещаться в любом месте процедуры.

Неперехваченные ошибки в объектах возвращаются в управляющее приложение, когда объект выполняется как исполняемый файл. В среде разработки неперехваченные ошибки только возвращаются в управляющее приложение, если заданы надлежащие параметры. Следующие сведения см. в документации ведущего приложения: какие параметры следует задать во время отладки, как задать эти параметры, может ли ведущее приложение создавать классы.

Если создается объект, имеющий доступ к другим объектам, следует попытаться обработать ошибки, передаваемые из этих объектов необработанными. Если вам не удается обрабатывать такие ошибки, сопоставьте код ошибки в Err.Number с одной из собственных ошибок и затем передайте их обратно вызывающей стороне объекта. Следует указать ошибку, добавив код ошибки в константу vbObjectError. Например, если код вашей ошибки — 1052, назначьте его следующим образом:

Системные ошибки во время вызовов ресурсов кода библиотек динамической компоновки (DLL) Windows или Macintosh не вызывают исключений и не могут быть перехвачены при перехвате ошибок Visual Basic. При вызове функций DLL необходимо проверить каждое возвращаемого значения на успешность или сбой (в соответствии со спецификациями API), а в случае сбоя проверьте значение в свойстве lastDLLError объекта Err. Свойство LastDLLError всегда возвращает ноль в Macintosh.

Пример

В этом примере сначала используется оператор On Error GoTo для указания местоположения программы обработки ошибок в процедуре. В примере попытка удалить открытый файл генерирует ошибку номер 55. Ошибка обрабатывается в программе обработки ошибок, и затем управление возвращается к оператору, вызвавшему ошибку. Оператор On Error GoTo 0 выключает перехват ошибок.

Затем заявление On Error Resume Next используется для отсрочки улавливания ошибок, чтобы можно было точно знать контекст ошибки, порожденной следующим утверждением. Обратите внимание, что Err.Clear используется для очистки свойств объекта Err после обработки ошибки.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Оператор On Error (Visual Basic)

Включает подпрограммы обработки ошибок и задает расположение процедуры в процедуре. также может использоваться для отключения подпрограммы обработки ошибок. On Error Оператор используется в неструктурированной обработке ошибок и может использоваться вместо структурной обработки исключений. Структурированная обработка исключений встроена в .NET, как правило, более эффективна и поэтому рекомендуется при обработке ошибок во время выполнения в приложении.

Без обработки ошибок или обработки исключений любая возникающая ошибка времени выполнения является неустранимой: отображается сообщение об ошибке, и выполнение останавливается.

Error Ключевое слово также используется в инструкции Error, которая поддерживается для обеспечения обратной совместимости.

Синтаксис

Компоненты

Термин Определение
GoTo строка Включает подпрограммы обработки ошибок, которая начинается в строке, указанной в аргументе обязательной строки . Аргумент line имеет любую метку или номер строки. Если возникает ошибка времени выполнения, Управление подразделениями выполняется до указанной строки, делая активным обработчик ошибок. Указанная строка должна находиться в той же процедуре, что On Error и инструкция, либо возникнет ошибка времени компиляции.
GoTo 0 Отключает включенный обработчик ошибок в текущей процедуре и сбрасывает его в Nothing .
GoTo -1 Отключает включенное исключение в текущей процедуре и сбрасывает его в Nothing .
Resume Next Указывает, что при возникновении ошибки во время выполнения управление переходит к оператору, непосредственно следующему за оператором, где произошла ошибка, и выполнение продолжается с этой точки. Используйте эту форму вместо On Error GoTo доступа к объектам.

Комментарии

Рекомендуется использовать структурированную обработку исключений в коде, когда это возможно, а не использовать неструктурированную обработку исключений и On Error инструкцию. Дополнительные сведения см. в разделе Оператор Try. Catch. Finally.

Обработчик ошибок с включенным параметром — это тот, который включен On Error оператором. «Активный» обработчик ошибок — это включенный обработчик, который находится в процессе обработки ошибки.

Если ошибка возникает при активном обработчике ошибок (между возникновением ошибки и Resume Exit Sub Exit Function оператором,, или Exit Property ), обработчик ошибок текущей процедуры не может справиться с ошибкой. Управление возвращается вызывающей процедуре.

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

Каждый раз, когда обработчик ошибок передает управление в вызывающую процедуру, эта процедура преобразуется в текущую процедуру. После обработки ошибки обработчиком ошибок в любой процедуре выполнение возобновляется в текущей процедуре в точке, указанной в Resume инструкции.

Подпрограммы обработки ошибок не являются Sub процедурой или Function процедурой. Это раздел кода, помеченный меткой строки или номером строки.

Number, свойство

Для определения причины ошибки подпрограммы обработки ошибок зависят от значения Number свойства Err объекта. Подпрограммы должны протестировать или сохранить релевантные значения свойств в Err объекте, прежде чем может возникнуть любая другая ошибка или пока не будет вызвана процедура, которая может вызвать ошибку. Значения свойств в Err объекте соответствуют только самой последней ошибке. Сообщение об ошибке, связанное с Err.Number , содержится в Err.Description .

Оператор Throw

Ошибка, возникающая при использовании Err.Raise метода, задает Exception для свойства только что созданный экземпляр Exception класса. Для поддержки вызова исключений производных типов исключений в Throw языке поддерживается инструкция. Это принимает единственный параметр, который является экземпляром исключения, который будет выдаваться. В следующем примере показано, как можно использовать эти функции с существующей поддержкой обработки исключений.

Обратите внимание, что On Error GoTo оператор захватывает все ошибки независимо от класса исключений.

При возникновении ошибки далее

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

On Error Resume Next Конструкция может быть предпочтительнее On Error GoTo при обработке ошибок, формируемых во время доступа к другим объектам. Проверка Err после каждого взаимодействия с объектом устраняет неоднозначность того, к какому объекту был получен доступ в коде. Можно убедиться, какой объект поместил код ошибки Err.Number , а также какой объект изначально сгенерировал ошибку (объект, указанный в Err.Source ).

On Error GoTo 0

On Error GoTo 0 отключает обработку ошибок в текущей процедуре. В нем не указывается строка 0 в качестве начала кода обработки ошибок, даже если процедура содержит строку с номером 0. Без On Error GoTo 0 оператора обработчик ошибок автоматически отключается при выходе из процедуры.

On Error GoTo-1

On Error GoTo -1 отключает исключение в текущей процедуре. В нем не указывается строка-1 в качестве начала кода обработки ошибок, даже если процедура содержит строку с номером-1. Без On Error GoTo -1 оператора исключение автоматически отключается при выходе из процедуры.

Чтобы предотвратить выполнение кода обработки ошибок в случае отсутствия ошибок, поместите Exit Sub Exit Function оператор, или Exit Property непосредственно перед подпрограммой обработки ошибок, как в следующем фрагменте:

Здесь код обработки ошибок следует за Exit Sub оператором и предшествует End Sub оператору, чтобы отделить ее от потока процедур. Код обработки ошибок можно разместить в любом месте процедуры.

Неперехваченные ошибки

Неперехваченные ошибки в объектах возвращаются в управляющее приложение, когда объект выполняется как исполняемый файл. В среде разработки неперехваченные ошибки возвращаются в управляющее приложение только в том случае, если установлены соответствующие параметры. Сведения о том, какие параметры должны быть установлены во время отладки, как их задать, а также определить, может ли узел создавать классы, см. документацию по ведущему приложению.

При создании объекта, обращающегося к другим объектам, следует попытаться обрабатывать любые необработанные ошибки, которые они передают. Если вы не можете, сопоставьте коды ошибок Err.Number с одной из собственных ошибок, а затем передавайте их обратно вызывающему объекту. Необходимо указать ошибку, добавив код ошибки в VbObjectError константу. Например, если код ошибки — 1052, назначьте его следующим образом:

системные ошибки во время вызовов Windows библиотеки динамической компоновки (dll) не вызывают исключений и не могут быть перехвачены при перехвате ошибок Visual Basic. При вызове функций DLL следует проверять каждое возвращаемое значение на успех или сбой (в соответствии со спецификациями API), а в случае сбоя проверить значение в Err LastDLLError свойстве объекта.

Пример

В этом примере сначала используется On Error GoTo оператор, чтобы указать расположение подпрограммы обработки ошибок в процедуре. В этом примере попытка деления на ноль приводит к возникновению ошибки с номером 6. Ошибка обрабатывается в подпрограммы обработки ошибок, а затем Управление возвращается инструкции, вызвавшей ошибку. On Error GoTo 0 Инструкция отключает перехват ошибок. Затем On Error Resume Next оператор используется для задержки перехвата ошибок таким образом, чтобы контекст для ошибки, создаваемой следующей инструкцией, мог быть известен для определенных. Обратите внимание, что Err.Clear используется для очистки Err свойств объекта после обработки ошибки.

Требования

Пространство имен: Microsoft. VisualBasic

Источник

Читайте также:  Почему не работает дисковод компьютере
Оцените статью