VBScript — Foutafhandeling gebruiken

Ik wil VBScript gebruiken om fouten op te vangen en ze te loggen (dwz bij fout “log iets”) en ga dan verder met de volgende regel van het script.

Bijvoorbeeld

Bij Fout Hervatten Volgende
'Doe stap 1'
'Doe stap 2'
'Doe stap 3'

Als er een fout optreedt bij stap 1, wil ik dat deze die fout registreert (of er andere aangepaste functies mee uitvoert) en vervolgens doorgaat met stap 2. Is dit mogelijk? en hoe kan ik het implementeren?

EDIT: Kan ik zoiets doen?

Bij fout hervat myErrCatch
'Doe stap 1'
'Doe stap 2'
'Doe stap 3'
mijnErrCatch:
'logfout'
Volgende hervatten

Antwoord 1, autoriteit 100%

VBScript heeft geen idee van het gooien of vangen van uitzonderingen, maar de runtime biedt een globaal Err-object dat de resultaten bevat van de laatst uitgevoerde bewerking. U moet na elke bewerking expliciet controleren of de eigenschap Err.Number niet nul is.

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

De syntaxis “On Error Goto [label]” wordt ondersteund door Visual Basic en Visual Basic for Applications (VBA), maar VBScript ondersteunt deze taalfunctie niet, dus u moet On Error Resume Next gebruiken zoals hierboven beschreven.


Antwoord 2, autoriteit 7%

Houd er rekening mee dat On Error Resume Nextniet algemeen is ingesteld. U kunt uw onveilige deel van de code bijv. in een functie plaatsen, die onmiddellijk wordt onderbroken als er een fout optreedt, en deze functie aanroepen vanuit een sub met een precedent OERN-statement.

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

Antwoord 3, Autoriteit 2%

U kunt uw stappenfuncties hergroeperen, oproepen in een FACADE-functie:

sub facade()
    call step1()
    call step2()
    call step3()
    call step4()
    call step5()
end sub

Laat uw foutbehandeling in een bovenste functie zijn die de gevel noemt:

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

Nu, laten we veronderstellen step3()Verhoogt een fout. Aangezien facade()NIET omgaan met fouten (er is nee On error resume nextin facade()) , de fout wordt teruggestuurd naar main()en step4()EN step5()WORDT NIET UITGEVOEGD.

Uw foutafhandeling is nu weer in 1-codeblok


Antwoord 4

Ik ben uitzonderlijk nieuw op VBScript, dus dit mag niet worden beschouwd als de beste praktijken of er kan een reden zijn, het zou niet moeten worden gedaan op die manier waar ik nog niet van bewust ben, maar dit is de oplossing die ik kwam Met om de hoeveelheid foutlogboekcode in mijn hoofdcodeblok in te kakelen.

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

Other episodes