Try-Catch-End Попробуйте в VBScript
Я пытаюсь использовать следующий код:
Try
Throw 2 'How do I throw an exception?
Catch ex
'What do I do here?
End Try
но я получаю ошибку Statement expected
в предложении catch.
Кто-нибудь знает, как я могу поймать/выбросить исключения в VBScript, используя try/catch? (Я не ищу решения с помощью On Error Do X
.)
Ответы
Ответ 1
У VBScript нет Try/Catch. (Ссылка на язык VBScript. Если у него есть Try, он будет указан в разделе "Заявления".)
On Error Resume Next
- единственная обработка ошибок в VBScript. Сожалею. Если вы хотите try/catch, JScript - это опция. Он везде поддерживает VBScript и имеет те же возможности.
Ответ 2
Обработка ошибок
В VBScript доступен нам "старый стиль" обработки ошибок, который использует On Error Resume Next
. Сначала мы включаем это (часто в верхней части файла, но вы можете использовать его вместо первого Err.Clear
ниже для их комбинированного эффекта), а затем перед запуском нашего кода с возможной ошибкой очистите все ошибки, которые уже произошел, запустить код, способный генерировать ошибки, и затем явно проверить наличие ошибок:
On Error Resume Next
' ...
' Other Code Here (that may have raised an Error)
' ...
Err.Clear ' Clear any possible Error that previous code raised
Set myObj = CreateObject("SomeKindOfClassThatDoesNotExist")
If Err.Number <> 0 Then
WScript.Echo "Error: " & Err.Number
WScript.Echo "Error (Hex): " & Hex(Err.Number)
WScript.Echo "Source: " & Err.Source
WScript.Echo "Description: " & Err.Description
Err.Clear ' Clear the Error
End If
On Error Goto 0 ' Don't resume on Error
WScript.Echo "This text will always print."
Выше мы просто распечатываем ошибку, если она произошла. Если ошибка была фатальной для script, вы могли бы заменить второй Err.Clear
на WScript.Quit(Err.Number)
.
Также обратите внимание на On Error Goto 0
, который отключает возобновление выполнения в следующем выражении при возникновении ошибки.
Если вы хотите проверить поведение, когда Set
преуспевает, продолжайте и прокомментируйте эту строку или создайте объект, который будет успешным, например vbscript.regexp
.
Директива On Error
влияет только на текущую область выполнения (текущий Sub
или Function
) и не влияет на вызовы или вызываемые области.
Повышение ошибок
Если вы хотите проверить какое-то состояние, а затем поднять ошибку, которую нужно обработать кодом, вызывающим вашу функцию, вы должны использовать Err.Raise
. Err.Raise
принимает до пяти аргументов, Number
, Source
, Description
, HelpFile
и HelpContext
. Использование файлов справки и контекстов выходит за рамки этого текста. Number
- номер ошибки, который вы выберете, Source
- это имя вашего приложения/класса/объекта/свойства, которое вызывает ошибку, а Description
- краткое описание произошедшей ошибки.
If MyValue <> 42 Then
Err.Raise(42, "HitchhikerMatrix", "There is no spoon!")
End If
Затем вы можете обрабатывать поднятую ошибку, как описано выше.
Журнал изменений
Изменить # 1:
Добавлен Err.Clear
до возможной ошибки, в результате чего строка очистит все предыдущие ошибки, которые могут быть проигнорированы.
Суб >
Изменить # 2:
Уточнено.Суб >
Изменить №3:
Добавлены комментарии в блоке кода. Уточнено, что ожидается, что будет больше кода между On Error Resume Next
и Err.Clear
. Исправлена некоторая грамматика, чтобы быть менее неудобной. Добавлена информация о Err.Raise
. Форматирование.
Суб >
Ответ 3
Попробуйте Catch существует через обходной путь в VBScript:
http://web.archive.org/web/20140221063207/http://my.opera.com/Lee_Harvey/blog/2007/04/21/try-catch-finally-in-vbscript-sure
Class CFunc1
Private Sub Class_Initialize
WScript.Echo "Starting"
Dim i : i = 65535 ^ 65535
MsgBox "Should not see this"
End Sub
Private Sub CatchErr
If Err.Number = 0 Then Exit Sub
Select Case Err.Number
Case 6 WScript.Echo "Overflow handled!"
Case Else WScript.Echo "Unhandled error " & Err.Number & " occurred."
End Select
Err.Clear
End Sub
Private Sub Class_Terminate
CatchErr
WScript.Echo "Exiting"
End Sub
End Class
Dim Func1 : Set Func1 = New CFunc1 : Set Func1 = Nothing
Ответ 4
Иногда, особенно когда вы работаете с VB, вы можете пропустить очевидные решения. Как я делал последние 2 дня.
код, который генерирует ошибку, должен быть перемещен в отдельную функцию. И в начале функции вы пишете On Error Resume Next
. Вот как можно "усвоить" ошибку, не проглатывая никаких других ошибок. Разделение кода на небольшие отдельные функции также улучшает читаемость, рефакторинг и упрощает добавление новых функций.