Try-Catch-End Try dans VBScript ne semble pas fonctionner

Je suis essayant le code suivant:

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

Mais je reçois l'erreur Statement expected dans la clause catch.

Est-ce que quelqu'un sait comment je peux attraper/lancer des exceptions dans VBScript en utilisant try/catch? (Je suis pas à la recherche de solutions avec On Error Do X.)

31
demandé sur bobobobo 2011-02-15 05:25:06

4 réponses

VBScript n'a pas Try/Catch. (référence du langage VBScript . S'il avait essayé, il serait répertorié dans la section des déclarations.)

On Error Resume Next est la seule gestion des erreurs dans VBScript. Désolé. Si vous voulez try / catch, JScript est une option. Il est pris en charge partout que VBScript est et a les mêmes capacités.

19
répondu Tmdean 2011-02-15 03:30:40

Gestion Des Erreurs

Une sorte de" style plus ancien " de gestion des erreurs nous est disponible dans VBScript, qui utilise On Error Resume Next. Nous activons d'abord cela (souvent en haut d'un fichier; mais vous pouvez l'utiliser à la place de le premier Err.Clear ci-dessous pour leur effet combiné), puis avant d'exécuter notre code de génération d'erreur possible, effacez les erreurs qui se sont déjà produites, exécutez le code de génération d'erreur possible, puis vérifiez explicitement les erreurs:

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

Ci-dessus, nous sommes il suffit d'imprimer l'erreur si elle s'est produite. Si l'erreur était fatale au script, vous pouvez remplacer le second Err.clear par WScript.Quit(Err.Number).

Notez également le {[6] } qui désactive la reprise de l'exécution à l'instruction suivante lorsqu'une erreur se produit.

Si vous voulez tester le comportement pour savoir quand le Set réussit, allez-y et commentez cette ligne ou créez un objet qui réussira, tel que vbscript.regexp.

La directive On Error n'affecte que la portée en cours d'exécution (current Sub ou Function) et n'affecte pas l'appel ou les étendues appelées.


Générer Des Erreurs

Si vous voulez vérifier une sorte d'état et ensuite déclencher une erreur à gérer par le code qui appelle votre fonction, vous utiliseriez Err.Raise. Err.Raise prend jusqu'à cinq arguments, Number, Source, Description, HelpFile, et HelpContext. L'utilisation de fichiers d'AIDE et de contextes dépasse la portée de ce texte. Number est un numéro d'erreur que vous choisissez, Source est le nom de votre application / classe / objet / propriété erreur, et Description est une courte description de l'erreur qui s'est produite.

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

Vous pouvez ensuite gérer l'erreur soulevée comme indiqué ci-dessus.


Journal Des Modifications

  • Modifier #1: Ajout d'un Err.Clear avant l'erreur éventuelle provoquant la ligne pour effacer toutes les erreurs précédentes qui peuvent avoir été ignorées.
  • Modifier #2: Clarifier.
  • Modifier #3: Ajout de commentaires dans le bloc de code. A précisé qu'il était censé être plus code entre On Error Resume Next et Err.Clear. Correction d'une certaine grammaire pour être moins maladroit. Ajout d'informations sur Err.Raise. Formater.
  • 65
    répondu Mark Ribau 2015-10-24 05:15:24

    Essayez Catch exists via une solution de contournement dans 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
    répondu AngelicCare 2017-08-14 14:38:05

    Parfois, surtout lorsque vous travaillez avec VB, vous pouvez manquer des solutions évidentes. Comme je faisais les 2 derniers jours.

    Le code qui génère une erreur doit être déplacé vers une fonction distincte. Et au début de la fonction, vous écrivez On Error Resume Next. C'est ainsi qu'une erreur peut être "avalée", sans avaler d'autres erreurs. Diviser le code en petites fonctions séparées améliore également la lisibilité, le refactoring et facilite l'ajout de nouvelles fonctionnalités.

    0
    répondu Vital 2017-08-14 14:39:40