Подтвердить что ты не робот

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.)

4b9b3361

Ответ 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. Вот как можно "усвоить" ошибку, не проглатывая никаких других ошибок. Разделение кода на небольшие отдельные функции также улучшает читаемость, рефакторинг и упрощает добавление новых функций.