it-swarm.com.de

Try-Catch-End Try in VBScript scheint nicht zu funktionieren

Ich bin versuche den folgenden Code:

Try ' DOESN'T WORK
    Throw 2 ' How do I throw an exception?
Catch ex
    'What do I do here?
End Try

aber ich erhalte den Fehler Statement expected in der catch-Klausel.

Weiß jemand, wie ich Ausnahmen in VBScript mit try/catch fangen/werfen kann? (Ich bin nicht suche nach Lösungen mit On Error Do X.)

31
Mehrdad

VBScript hat Try/Catch nicht. ( VBScript-Referenz . Wenn es Try hätte, wäre es im Abschnitt Statements aufgeführt.)

On Error Resume Next ist die einzige Fehlerbehandlung in VBScript. Es tut uns leid. Wenn Sie versuchen/fangen möchten, ist JScript eine Option. Es wird überall unterstützt, wo VBScript ist und hat die gleichen Funktionen.

19
Tmdean

Fehler behandeln 

In VBScript steht uns eine Art "älterer" Fehlerbehandlung zur Verfügung, die On Error Resume Next verwendet. Zuerst aktivieren wir das (häufig am Anfang einer Datei; Sie können jedoch anstelle von dem ersten Err.Clear unten für ihre kombinierte Wirkung verwenden), bevor Sie den möglicherweise fehlererzeugenden Code ausführen, bevor Sie den Fehler ausführen sind bereits aufgetreten, führen Sie den möglicherweise fehlererzeugenden Code aus und prüfen Sie dann explizit auf Fehler:

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

Oben drucken wir den Fehler nur aus, wenn er aufgetreten ist. Wenn der Fehler für das Skript schwerwiegend war, könnten Sie den zweiten Err.clear durch WScript.Quit(Err.Number) ersetzen.

Beachten Sie auch den On Error Goto 0, der die Wiederaufnahme der Ausführung bei der nächsten Anweisung deaktiviert, wenn ein Fehler auftritt.

Wenn Sie das Verhalten für den Erfolg der Set testen möchten, kommentieren Sie diese Zeile aus oder erstellen Sie ein erfolgreiches Objekt, z. B. vbscript.regexp.

Die On Error-Direktive wirkt sich nur auf den aktuell ausgeführten Bereich aus (aktuelle Sub oder Function) und wirkt sich nicht auf aufrufende oder aufgerufene Bereiche aus.


Fehler auslösen 

Wenn Sie eine Art Status überprüfen und dann einen Fehler auslösen möchten, der von Code behandelt wird, der Ihre Funktion aufruft, würden Sie Err.Raise verwenden. Err.Raise nimmt bis zu fünf Argumente auf, Number, Source, Description, HelpFile und HelpContext. Die Verwendung von Hilfedateien und Kontexten liegt außerhalb des Rahmens dieses Textes. Number ist eine von Ihnen gewählte Fehlernummer, Source ist der Name Ihrer Anwendung/Klasse/Objekt/Eigenschaft, die den Fehler auslöst, und Description ist eine kurze Beschreibung des aufgetretenen Fehlers.

If MyValue <> 42 Then
    Err.Raise(42, "HitchhikerMatrix", "There is no spoon!")
End If

Sie können dann den oben beschriebenen Fehler behandeln.


Änderungsprotokoll

  • Edit # 1: Ein Err.Clear wurde vor der möglicherweise fehlerhaften Zeile eingefügt, um alle zuvor ignorierten Fehler zu löschen .
  • Bearbeiten Sie Nr. 2:
  • Bearbeiten # 3: Kommentare im Codeblock hinzugefügt. Es wurde klargestellt, dass erwartet wurde, dass mehr Code zwischen On Error Resume Next und Err.Clear vorhanden ist. Einige Grammatik wurde korrigiert, damit sie weniger umständlich ist. Info zu Err.Raise hinzugefügt. Formatierung.
  • 67
    Mark Ribau

    Versuchen Sie, Catch exists über einen Workaround in VBScript auszuführen:

    http://web.archive.org/web/20140221063207/http://my.opera.com/Lee_Harvey/blog/2007/04/21/try-catch-finale-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

    Manchmal, besonders wenn Sie mit VB arbeiten, können Sie offensichtliche Lösungen verpassen. So wie ich es letzte 2 Tage gemacht habe.

    der Code, der Fehler generiert, muss in eine separate Funktion verschoben werden. Und am Anfang der Funktion schreiben Sie On Error Resume Next. So kann ein Fehler "verschluckt" werden, ohne andere Fehler zu schlucken. Das Aufteilen von Code in kleine separate Funktionen verbessert auch die Lesbarkeit, das Umgestalten und das Hinzufügen neuer Funktionen.

    0
    Vital