Question

Je souhaite utiliser VBScript pour détecter les erreurs et les consigner (c.-à-d. en cas d'erreur "), puis reprendre la ligne suivante du script.

Par exemple,

On Error Resume Next
'Do Step 1
'Do Step 2
'Do Step 3

Quand 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
'Do step 1
'Do step 2
'Do step 3

myErrCatch:
'log error
Resume Next
Était-ce utile?

La solution

VBScript n'a aucune notion des exceptions générées ou capturées, mais le moteur d'exécution fournit un objet Err global contenant les résultats de la dernière opération effectuée. Vous devez vérifier explicitement si la propriété Err.Number est non nulle 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

Le " On Error Goto [label] " La syntaxe 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.

Autres conseils

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 précédent 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

Je suis exceptionnellement nouveau dans VBScript. Cela peut donc ne pas être considéré comme une pratique exemplaire ou une raison pour laquelle cela ne devrait pas être fait de cette façon dont je ne suis pas au courant, mais voici la solution que j'ai trouvée avec 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

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

Laissez ensuite votre gestion des erreurs 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 ( non si erreur, reprise suivante dans facade () ) , l'erreur sera renvoyée à main () et à step4 () et step5 () ne sera pas exécuté.

Le traitement de vos erreurs est maintenant refactoré dans un bloc de code

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top