Поскольку в VBScript общеизвестно плохая встроенная обработка ошибок, я попытался обойти это, обернув свои основные блоки в цикл Do While Err.Number = 0
. Теоретически это должно работать: если в скрипте включен оператор On Error Resume Next
, он будет обходить встроенный обработчик ошибок в WSH (т.е. полностью его останавливать), все еще заполняя свой объект Err
. Что должно произойти дальше, это то, что номер ошибки изменится, что должно вызвать прерывание в цикле и заставить его выпрыгнуть в другую ветвь кода. (Извините за ссылки ASM.)
Однако, похоже, это не всегда работает. Иногда он будет делать именно то, что описано выше, и будет работать прекрасно. В других случаях, однако, он просто полностью игнорирует изменения и продолжает идти. Даже когда я проверяю объект в отладчике, я вижу, как WSH изменяет номер ошибки и другие ее члены, но слепо игнорирует условие цикла!
Что дает?
Пример:
Dim TestObject
Do While Err.Number = 0
Set TestObject = CreateObject("Scripting.FileSystem") 'should trigger an error
WScript.Echo "Who cares about your DO?!"
Loop
WScript.Echo "Script should go here."
WScript.Quit(0)
Спасибо!