webentwicklung-frage-antwort-db.com.de

VBScript - Fehlerbehandlung verwenden

Ich möchte mit VBScript Fehler abfangen und protokollieren (dh bei Fehler "etwas protokollieren") und die nächste Zeile des Skripts fortsetzen.

Zum Beispiel,

 Bei Fehler Resume Next 
 'Schritt 1 
' Schritt 2 
 'Schritt 3 

Wenn in Schritt 1 ein Fehler auftritt, möchte ich, dass der Fehler protokolliert wird (oder andere benutzerdefinierte Funktionen damit ausgeführt werden), und dann mit Schritt 2 fortfahren. Ist dies möglich? und wie kann ich es umsetzen?

EDIT: Kann ich so etwas tun?

Bei Fehler Fortsetzen von myErrCatch
 'Führen Sie Schritt 1 aus
' Führen Sie Schritt 2 aus
 'Führen Sie Schritt 3 aus
76
apandit

VBScript hat keine Ahnung, Ausnahmen auszulösen oder abzufangen, aber die Laufzeitumgebung stellt ein globales Err-Objekt bereit, das die Ergebnisse der zuletzt ausgeführten Operation enthält. Sie müssen explizit prüfen, ob die Err.Number-Eigenschaft nach jeder Operation nicht Null ist.

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

Die Syntax "On Error Goto [label]" wird von Visual Basic und Visual Basic für Applikationen (VBA) unterstützt. Da VBScript diese Sprachfunktion jedoch nicht unterstützt, müssen Sie On Error Resume Next wie oben beschrieben verwenden.

143
Dylan Beattie

Beachten Sie, dass On Error Resume Next nicht global festgelegt ist. Sie können Ihren unsicheren Teil des Codes z. B. in eine Funktion einfügen, die sofort unterbrochen wird, wenn ein Fehler auftritt, und diese Funktion kann von der untergeordneten Anweisung aufgerufen werden, die die OERN-Anweisung enthält.

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

Sie können Ihre Schritte Funktionsaufrufe in einer Fassadenfunktion gruppieren:

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

Lassen Sie dann Ihre Fehlerbehandlung in einer oberen Funktion sein, die die Fassade aufruft:

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

Angenommen, step3() löst einen Fehler aus. Da facade() keine Fehler behandelt (es gibt noOn error resume next in facade()), wird der Fehler an main() zurückgegeben und step4() und step5() werden nicht ausgeführt.

Ihre Fehlerbehandlung wird jetzt in 1 Codeblock überarbeitet

0
Cid

Ich bin ausnahmsweise neu in VBScript, daher ist dies möglicherweise nicht als bewährte Methode zu betrachten, oder es gibt einen Grund, warum es nicht auf diese Weise erfolgen sollte, von der ich noch nichts weiß, aber dies ist die Lösung, die ich zum Zuschneiden gefunden habe die Menge an Fehlerprotokollierungscode in meinem Hauptcodeblock.

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