Je veux utiliser VBScript pour identifier les erreurs et les enregistrer (c.-à-d. Si l'erreur "enregistrer quelque chose"), puis reprendre la ligne suivante du script.
Par exemple,
On Error Resume Next 'Effectuez l'étape 1 ' Exécutez l'étape 2 'Exécutez l'étape 3
Lorsqu’une erreur se produit à l’étape 1, je souhaite qu’elle enregistre cette erreur (ou exécute d’autres fonctions personnalisées avec celle-ci), puis la reprenne à l’étape 2. Est-ce possible? et comment puis-je le mettre en œuvre?
EDIT: Puis-je faire quelque chose comme ça?
On Error Resume myErrCatch 'Effectuez l'étape 1 ' Effectuez l'étape 2 'Effectuez l'étape 3 MyErrCatch: ' Erreur de journalisation Reprenez Suivant
VBScript n'a aucune notion des exceptions générées ou capturées, mais le moteur d'exécution fournit un objet global Err contenant les résultats de la dernière opération effectuée. Vous devez vérifier explicitement si la propriété Err.Number est différente de zéro après chaque opération.
On Error Resume Next
DoStep1
If Err.Number <> 0 Then
WScript.Echo "Error in DoStep1: " & Err.Description
Err.Clear
End If
DoStep2
If Err.Number <> 0 Then
WScript.Echo "Error in DoStop2:" & Err.Description
Err.Clear
End If
'If you no longer want to continue following an error after that block's completed,
'call this.
On Error Goto 0
La syntaxe "On Error Goto [label]" est prise en charge par Visual Basic et Visual Basic pour Applications (VBA), mais VBScript ne prend pas en charge cette fonctionnalité de langage. Vous devez donc utiliser On Error Resume Next comme décrit ci-dessus.
Notez que On Error Resume Next
n'est pas défini globalement. Vous pouvez placer votre partie de code non sécurisée, par exemple, dans une fonction, qui sera immédiatement interrompue si une erreur se produit, et appeler cette fonction depuis une sous-instruction contenant l'instruction OERN
.
ErrCatch()
Sub ErrCatch()
Dim Res, CurrentStep
On Error Resume Next
Res = UnSafeCode(20, CurrentStep)
MsgBox "ErrStep " & CurrentStep & vbCrLf & Err.Description
End Sub
Function UnSafeCode(Arg, ErrStep)
ErrStep = 1
UnSafeCode = 1 / (Arg - 10)
ErrStep = 2
UnSafeCode = 1 / (Arg - 20)
ErrStep = 3
UnSafeCode = 1 / (Arg - 30)
ErrStep = 0
End Function
Vous pouvez regrouper vos appels de fonctions d'étapes dans une fonction de façade:
sub facade()
call step1()
call step2()
call step3()
call step4()
call step5()
end sub
Ensuite, laissez votre gestion des erreurs être dans une fonction supérieure qui appelle la façade:
sub main()
On error resume next
call facade()
If Err.Number <> 0 Then
' MsgBox or whatever. You may want to display or log your error there
msgbox Err.Description
Err.Clear
End If
On Error Goto 0
end sub
Supposons maintenant que step3()
lève une erreur. Puisque facade()
ne gère pas les erreurs (il y a noOn error resume next
dans facade()
), l'erreur sera renvoyée à main()
et step4()
et step5()
ne seront pas exécutées.
Le traitement de votre erreur est maintenant refactored dans 1 bloc de code
Je suis exceptionnellement nouveau dans VBScript. Par conséquent, cela peut ne pas être considéré comme une pratique exemplaire ou une raison pour laquelle cela ne devrait pas être fait de cette façon, mais je ne suis pas au courant, mais voici la solution que j'ai trouvée pour réduire la quantité de code de journalisation des erreurs dans mon bloc de code principal.
Dim oConn, connStr
Set oConn = Server.CreateObject("ADODB.Connection")
connStr = "Provider=SQLOLEDB;Server=XX;UID=XX;PWD=XX;Databse=XX"
ON ERROR RESUME NEXT
oConn.Open connStr
If err.Number <> 0 Then : showError() : End If
Sub ShowError()
'You could write the error details to the console...
errDetail = "<script>" & _
"console.log('Description: " & err.Description & "');" & _
"console.log('Error number: " & err.Number & "');" & _
"console.log('Error source: " & err.Source & "');" & _
"</script>"
Response.Write(errDetail)
'...you could display the error info directly in the page...
Response.Write("Error Description: " & err.Description)
Response.Write("Error Source: " & err.Source)
Response.Write("Error Number: " & err.Number)
'...or you could execute additional code when an error is thrown...
'Insert error handling code here
err.clear
End Sub