VBScript & # 8212; Utilizzo della gestione degli errori
-
03-07-2019 - |
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
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