Понимание ОШИБКИ в VBScript

#vbscript

#vbscript

Вопрос:

Я пытаюсь изменить vbscript и преобразовать его в Powershell в соответствии с инструкциями. У меня есть блок кода в моей функции SearchAD с ошибкой.

 on error resume next
Set objRS = command.execute

SearchAD = objRS.RecordCount
on error goto 0
 

Мой вопрос заключается в том, какая часть кода может вызвать ВОЗОБНОВЛЕНИЕ следующей и какая часть предназначена для GOTO 0.

Ответ №1:

В VBScript есть два состояния ошибки (три в других VBS).

 On Error Goto 0
 

vbscript обрабатывает ошибки. Ваша программа вылетает из-за ошибок.

 On Error Resume Next
 

VBScript устанавливает объект err, но не выдает ошибку. Вы должны ставить после каждой строки, которая может вызвать ошибку

 If err.number <> 0 then 
    FreakoutAndFixTheError
    err.clear
    wscript.quit 'if you can't fix
End If
 

В VB6 и VBA также

 On Error Goto LineNumber (or a label)
 

Комментарии:

1. Все наоборот. On Error Resume Next _en_ables обработка ошибок (это означает, что скрипт не вылетает при ошибке), On Error Goto 0 _dis_ables его.

Ответ №2:

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

 ' This statement will cause VBScript to throw an error and halt.
i = 1 / 0

' Instead, let us handle the error and decide if its important...
On Error Resume Next    ' Turn off error reporting
i = 1 / 0

' Now, we can test the Err object to see if any errors were thrown...
If Err.Number = 0 Then
    ' Success. No error occurred.
ElseIf Err.Number = 11 Then
    ' Error #11 is 'Division by zero'. Do we want to allow it?
End If

' We're through the risky section. Restore error reporting.
On Error GoTo 0
 

Теперь время для разглагольствования мыльницы. Не используйте его. Почти всегда есть лучшие способы, чем использование On Error Resume Next . Утверждение значений переменных. Проверьте границы вашего массива, прежде чем пытаться получить доступ к элементам массива. Проведите тестирование качества. Проверьте вводимые пользователем данные. Будь хорошим программистом и учитывай все свои аспекты. Не просто закрывайте глаза на любые ошибки и предполагайте, что все будет работать. Этим слишком часто злоупотребляют новички в VB и, к сожалению, даже некоторые эксперты! (конец разглагольствования)

Комментарии:

1. Ваша напыщенная речь показывает непонимание. Во-первых, каждая реальная программа должна иметь on error resume next — и программист должен проверить наличие ошибок. Я не знаю, согласны ли вы с этим, я так не думаю. ВО- ВТОРЫХ , Vbscript часто используется как язык пакетного типа. В пакетном режиме обычно требуется, чтобы все продолжалось с ошибками. Вы хотите, чтобы было обработано 99% вашего файла, если это все, что можно сделать. Вы не хотите, чтобы 10% выполнялось, потому что кто-то открыл LeaveRoster.doc .

2. @phd443322 Похоже, нам придется не согласиться. Ничто не мешает программисту предвидеть ошибки и проверять их без использования On Error . Чаще всего ошибки даже не проверяются, как в примере OP. Многие (если не большинство) проблем на этом самом сайте вызваны тем On Error Resume Next , что он использовался в локальной или, что еще хуже, глобальной области. «Я не получаю сообщение об ошибке. Это просто не работает «. Что касается идеи о том, что VBS — это «пакетный» язык (с которым я также не согласен), я не хочу, чтобы мой сценарий продолжался, как будто ничего не произошло, просто чтобы он «завершался».

3. Вы неправильно поняли мои комментарии. Ваша критика по поводу неправильного использования on error resume next верна. Однако практика программирования заключается в том, чтобы пытаться обрабатывать ошибки. Языки разработаны с учетом этого. Проверка, скорее всего, увеличила бы время выполнения. Ваш подход окупился бы, если бы сбои были очень вероятными. Но это редко бывает.

4. @phd443322 Я согласен со многим из того, что вы говорите. Обработка ошибок является необходимостью, что означает On Error Resume Next необходимость. Я полагаю, вместо того, чтобы говорить «Не используйте это.» , я должен был сказать: «Используйте это правильно!» . Потому что я видел слишком много примеров его небрежного использования. Как и в моем примере выше, я видел, как люди использовали его, чтобы скрыть ошибки деления на ноль — не для проверки ошибки, а для ее сокрытия. Вместо этого они могли бы просто утверждать, что делитель <> 0 .

5. Программист должен предвидеть, возможен ли ноль при нормальной работе. Если это так, они должны пройти проверку. Для ненормальной работы, где ноль не ожидается, это должно быть try — except (на современном жаргоне). Также точка vbs часто используется в качестве командного файла, on error resume next имеет полезность. Например, я хочу, чтобы было скопировано как можно больше моих документов.

Ответ №3:

Вот справка по VB6 (более подробная, чем у vbscript). VBA является основным языком VB6.

Справочник по Visual Basic для приложений

В заявлении об ошибке

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

Синтаксис

 On Error GoTo line 

On Error Resume Next

On Error GoTo 0
 

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

Описание инструкции

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

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

On Error GoTo 0 Отключает любой включенный обработчик ошибок в текущей процедуре.

Примечания

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

«Включенный» обработчик ошибок — это тот, который включается инструкцией On Error; «активный» обработчик ошибок — это включенный обработчик, который находится в процессе обработки ошибки. Если ошибка возникает, когда обработчик ошибок активен (между возникновением ошибки и инструкцией Resume, Exit Sub, Exit Function или Exit Property), обработчик ошибок текущей процедуры не может обработать ошибку. Управление возвращается к вызывающей процедуре. Если у вызывающей процедуры включен обработчик ошибок, он активируется для обработки ошибки. Если обработчик ошибок вызывающей процедуры также активен, управление возвращается к предыдущим вызывающим процедурам, пока не будет найден включенный, но неактивный обработчик ошибок. Если не найден неактивный, включенный обработчик ошибок, ошибка является фатальной в тот момент, когда она действительно произошла. Каждый раз, когда обработчик ошибок передает управление обратно вызывающей процедуре, эта процедура становится текущей процедурой. Как только ошибка обрабатывается обработчиком ошибок в любой процедуре, выполнение возобновляется в текущей процедуре в точке, обозначенной оператором Resume .

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

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

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

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

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

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

 Sub InitializeMatrix(Var1, Var2, Var3, Var4)
   On Error GoTo ErrorHandler
   . . .
   Exit Sub
ErrorHandler:
   . . .
   Resume Next
End Sub
 

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

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

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

 Err.Number = vbObjectError   1052
 

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


Отправьте отзыв в MSDN.Посмотрите здесь на онлайн-ресурсы MSDN.

Комментарии:

1. VBScript не поддерживается On Error Goto label , поэтому половина этого просто не применяется.

2. Только 1/5 не применяется. По сути, это лучшая документация, которая существует.

3. vbscript является подмножеством vba является подмножеством vb6

4. @adolfgarlic vbscript не является подмножеством vba — они оба являются разными подмножествами VB