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
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top