web-dev-qa-db-fra.com

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

Je suis essaye 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 attraper/lancer des exceptions dans VBScript en utilisant try/catch? (Je suis pas à la recherche de solutions avec On Error Do X.)

31
Mehrdad

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

On Error Resume Next est le seul traitement d'erreur dans VBScript. Pardon. Si vous voulez essayer/attraper, JScript est une option. Il est pris en charge partout où VBScript est et possède les mêmes capacités.

19
Tmdean

Gestion des erreurs 

Une sorte de "style ancien" de traitement des erreurs est disponible dans VBScript, qui utilise le code On Error Resume Next. Nous activons d’abord cela (souvent au début 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 potentiellement générateur d’erreur, effacez ont déjà eu lieu, exécutez le code générant éventuellement une erreur, 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 imprimons simplement l'erreur si elle s'est produite. Si l'erreur était fatale au script, vous pouvez remplacer le deuxième Err.clear par WScript.Quit(Err.Number).

Notez également le On Error Goto 0 qui désactive la reprise de l'exécution à l'instruction suivante lorsqu'une erreur se produit.

Si vous souhaitez tester le comportement lorsque la Set réussit, continuez et commentez cette ligne ou créez un objet qui réussira, tel que vbscript.regexp.

La directive On Error n'affecte que l'étendue en cours d'exécution (Sub ou Function courante) et n'affecte pas les étendues appelantes ou appelées.


Erreurs de relance 

Si vous souhaitez vérifier une sorte d'état, puis générer une erreur devant être traitée par un code appelant votre fonction, utilisez Err.Raise. Err.Raise accepte jusqu'à cinq arguments, Number, Source, Description, HelpFile et HelpContext. L'utilisation de fichiers d'aide et de contextes dépasse le cadre de ce texte. Number est un numéro d'erreur que vous choisissez, Source est le nom de votre application/classe/objet/propriété qui génère l'erreur et Description est une brève description de l'erreur survenue.

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

Vous pouvez alors gérer l'erreur générée comme indiqué ci-dessus.


Journal des modifications

  • Edit # 1: Ajoute un Err.Clear avant la ligne qui cause probablement l’erreur pour effacer toutes les erreurs précédentes qui auraient pu être ignorées .
  • Edit # 2: Clarifié.
  • Edit # 3: Ajout de commentaires dans le bloc de code. Clarification qu'il était prévu qu'il y aurait plus de code entre On Error Resume Next et Err.Clear. Correction d'une grammaire moins gênante. Ajout d'informations sur Err.Raise. Formatage .
  • 67
    Mark Ribau

    Essayez d'attraper existe via la 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
    AngelicCare

    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. La division du code en petites fonctions distinctes améliore également la lisibilité, le refactoring et facilite l'ajout de nouvelles fonctionnalités.

    0
    Vital