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
.)
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.
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.
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
Err.Clear
avant la ligne qui cause probablement l’erreur pour effacer toutes les erreurs précédentes qui auraient pu être ignorées .On Error Resume Next
et Err.Clear
. Correction d'une grammaire moins gênante. Ajout d'informations sur Err.Raise
. Formatage .Essayez d'attraper existe via la solution de contournement dans VBScript:
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
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.