web-dev-qa-db-fra.com

VBScript - Utilisation du traitement des erreurs

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 
76
apandit

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.

143
Dylan Beattie

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
8
omegastripes

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

0
Cid

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
0
MistyDawn