Vba не работает on error goto

Оператор 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

Источник

Vba не работает on error goto

Private Sub Command1_Click()
Dim FRT As Single

On Error GoTo 1
FRT = «ggg»
1:

Как же избежать этих «граблей»?

Ответы Всего ответов: 10

Ответить

Номер ответа: 1
Автор ответа:
EUGY

Вопросов: 0
Ответов: 454

Профиль | | #1

Добавлено: 26.07.07 20:57
Номер ответа: 2
Автор ответа:
Viktor Petrov

Вопросов: 12
Ответов: 27

Профиль | | #2

Добавлено: 26.07.07 20:59
Огромное спасибо.

Ответить

Номер ответа: 3
Автор ответа:
-АлександР-

Вопросов: 55
Ответов: 1008

Web-сайт: sham.clan.su
Профиль | | #3

Добавлено: 26.07.07 21:10
Ошибк возникает вот почему:
http://msdn2.microsoft.com/en-us/library/5hsw66as(vs.71).aspx

существует два варианта обработки ошибок:

On Error GoTo 0 disables error handling in the current procedure. It doesn’t specify line 0 as the start of the error-handling code, even if the procedure contains a line numbered 0. Without an On Error GoTo 0 statement, an error handler is automatically disabled when a procedure is exited.

On Error GoTo -1 disables the exception in the current procedure. It doesn’t specify line -1 as the start of the error-handling code, even if the procedure contains a line numbered -1. Without an On Error GoTo -1 statement, an exception is automatically disabled when a procedure is exited.

по умолчанию всегда стоит 0 и обрабатывается манипулятор ошибки, до 1-ой ошибки или выхода из процедуры, а не исключения

Private Sub Command1_Click()
Dim FRT As Single

Dim t As Integer

For t = 1 To 3
On Error GoTo -1
On Error GoTo 1
FRT = «ggg»
1:

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

Ответить

Номер ответа: 4
Автор ответа:
-АлександР-

Вопросов: 55
Ответов: 1008

Web-сайт: sham.clan.su
Профиль | | #4

Добавлено: 26.07.07 21:11
2EUGY, ты как-то сложно замутил, разве не проще просто так?

Private Sub Command1_Click()
Dim FRT As Single

Dim t As Integer

For t = 1 To 3
On Error Resume Next
FRT = «ggg»
1:

Ответить

Номер ответа: 5
Автор ответа:
Viktor Petrov

Вопросов: 12
Ответов: 27

Профиль | | #5

Добавлено: 26.07.07 21:19
2-АлександР-
Не, Resume Next, к сожалению, не пойдет. Этот кусок кода я привел лишь для демонстрации проблемы — в реальном приложении в случае возникновения ошибки приходится выполнять определенные действия, поэтому без GoTo не обойтись.

Ответить

Номер ответа: 6
Автор ответа:
EUGY

Вопросов: 0
Ответов: 454

Профиль | | #6

Добавлено: 26.07.07 21:25
Меня вообще тошнит от любого On Error в циклах.

Ответить

Номер ответа: 7
Автор ответа:
Viktor Petrov

Вопросов: 12
Ответов: 27

Профиль | | #7

Добавлено: 26.07.07 21:36
2EUGY
Понимаю, я, в-общем, про это же в соседней теме и писал. Надеюсь, что благодаря вашему там совету, удастся в итоге обойтись без этого.

Ответить

Номер ответа: 8
Автор ответа:
ZagZag

Вопросов: 87
Ответов: 1684

Профиль | | #8

Добавлено: 26.07.07 21:55
1. Обдумай как недопустить ошибки. Например проверяй типы переменных перед присваиванием. (IsNumeric etc)
2.

Private Sub Command1_Click()
Dim FRT As Single
On Error Resume Next

For t = 1 To 3
FRT = «ggg»
Next

Private Sub Command1_Click()
Dim FRT As Single
On Error Goto ErrProc

For t = 1 To 3
FRT = «ggg»
Next
Exit Sub
ErrProc:
MsgBox «ошибочка»
Resume Next
End Sub

Ответить

Вот ключевая фраза.

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

Источник

Читайте также:  Ноут самсунг не работает микрофон
Оцените статью
Номер ответа: 9
Автор ответа:
astoro

Вопросов: 31
Ответов: 391

Профиль | | #9

Добавлено: 27.07.07 06:28