Try-Catch-End Try в VBScript, похоже, не работает - PullRequest
32 голосов
/ 15 февраля 2011

Я пытаюсь следующий код:

Try ' DOESN'T WORK
    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.)

Ответы [ 4 ]

67 голосов
/ 06 мая 2011

Обработка ошибок

В 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."

Выше мы просто распечатываем ошибку, если она произошла.Если ошибка была фатальной для скрипта, вы можете заменить второй 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.Форматирование.
19 голосов
/ 15 февраля 2011

VBScript не имеет Try / Catch.( Справочник по языку VBScript . Если бы он имел Try, он был бы указан в разделе «Утверждения».)

On Error Resume Next - единственная обработка ошибок в VBScript.Сожалею.Если вы хотите попробовать / поймать, JScript является опцией.Повсеместно поддерживается VBScript и имеет те же возможности.

3 голосов
/ 22 февраля 2013

Try 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
0 голосов
/ 28 октября 2013

Иногда, особенно когда вы работаете с VB, вы можете пропустить очевидные решения.Как я делал последние 2 дня.

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

...