Domanda

Voglio usare VBScript per rilevare errori e registrarli (ad esempio in caso di errore "registra qualcosa"), quindi riprendi la riga successiva dello script.

Ad esempio,

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

Quando si verifica un errore nel passaggio 1, voglio che registri tale errore (o esegua altre funzioni personalizzate con esso), quindi riprenda dal passaggio 2. È possibile? e come posso implementarlo?

EDIT: posso fare qualcosa del genere?

On Error Resume myErrCatch
'Do step 1
'Do step 2
'Do step 3

myErrCatch:
'log error
Resume Next
È stato utile?

Soluzione

VBScript non ha alcuna idea di lanciare o catturare eccezioni, ma il runtime fornisce un oggetto Err globale che contiene i risultati dell'ultima operazione eseguita. Devi verificare esplicitamente se la proprietà Err.Number è diversa da zero dopo ogni operazione.

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

L'errore " in errore Vai a [etichetta] " la sintassi è supportata da Visual Basic e Visual Basic, Applications Edition (VBA), ma VBScript non supporta questa funzionalità di linguaggio, quindi è necessario utilizzare Su errore Riprendi Successivo come descritto sopra.

Altri suggerimenti

Si noti che On Error Resume Next non è impostato a livello globale. Puoi inserire la tua parte non sicura del codice, ad es. In una funzione, che si interromperà immediatamente in caso di errore, e chiamare questa funzione dal sub contenente la precedente istruzione 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

Sono eccezionalmente nuovo in VBScript, quindi questa potrebbe non essere considerata la migliore pratica o potrebbe esserci un motivo per cui non dovrebbe essere fatto in questo modo non sono ancora a conoscenza, ma questa è la soluzione che ho trovato con per ridurre la quantità di codice di registrazione degli errori nel mio blocco di codice principale.

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

È possibile raggruppare le chiamate delle funzioni dei passi in una funzione di facciata:

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

Quindi, lascia che la tua gestione degli errori sia in una funzione superiore che chiama la facciata:

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

Ora supponiamo che step3 () generi un errore. Poiché facade () non gestisce gli errori (c'è no in caso di errore riprendi successivo in facade () ) , l'errore verrà restituito a main () e step4 () e step5 () non verranno eseguiti.

La gestione degli errori è stata ora riformattata in 1 blocco di codice

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top