it-swarm-ru.tech

Try-Catch-End Try в VBScript, похоже, не работает

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

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

31
Mehrdad

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

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

19
Tmdean

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

Своего рода «старый стиль» обработки ошибок доступен нам в 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. Форматирование .
  • 67
    Mark Ribau

    Попробуйте Catch exist через обходной путь в 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
    
    3
    AngelicCare

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

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

    0
    Vital