VBScript - Uso de manejo de errores
-
03-07-2019 - |
Pregunta
Quiero usar VBScript para detectar errores y registrarlos (es decir, en caso de error " registrar algo ") y luego reanudar la siguiente línea del script.
Por ejemplo,
On Error Resume Next 'Do Step 1 'Do Step 2 'Do Step 3
Cuando se produce un error en el paso 1, quiero que lo registre (o realice otras funciones personalizadas con él) y luego se reanude en el paso 2. ¿Es esto posible? ¿Y cómo puedo implementarlo?
EDITAR: ¿Puedo hacer algo como esto?
On Error Resume myErrCatch 'Do step 1 'Do step 2 'Do step 3 myErrCatch: 'log error Resume Next
Solución
VBScript no tiene noción de lanzar o capturar excepciones, pero el tiempo de ejecución proporciona un objeto Err global que contiene los resultados de la última operación realizada. Debe comprobar explícitamente si la propiedad Err.Number no es cero después de cada operación.
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
El " En error Goto [etiqueta] " la sintaxis es compatible con Visual Basic y Visual Basic para aplicaciones (VBA), pero VBScript no es compatible con esta función de idioma, por lo que tiene que usar On Error Resume Next como se describe anteriormente.
Otros consejos
Tenga en cuenta que On Error Resume Next
no está configurado globalmente. Puede poner su parte insegura de código, por ejemplo, en una función, que se interrumpirá de inmediato si se produce un error, y puede llamar a esta función desde el sub subferino que contiene la declaración 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
Soy excepcionalmente nuevo en VBScript, por lo que esto no se considera una buena práctica o puede haber una razón por la que no se debería hacer de esa manera de la que aún no estoy al tanto, pero esta es la solución que encontré con para reducir la cantidad de código de registro de errores en mi bloque de código 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
Puede reagrupar las llamadas de funciones de pasos en una función de fachada:
sub facade()
call step1()
call step2()
call step3()
call step4()
call step5()
end sub
Luego, deje que su manejo de errores esté en una función superior que llame a la fachada:
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
Ahora, supongamos que step3 ()
genera un error. Ya que facade ()
no maneja los errores (no hay no En el siguiente resumen de código
en facade ()
) , el error se devolverá a main ()
y step4 ()
y step5 ()
no se ejecutarán.
Su manejo de errores ahora está refactorizado en 1 bloque de código