Pergunta

Eu quero usar VBScript a erros de captura e registrá-los (ou seja, em caso de erro "log algo"), em seguida, retomar a próxima linha do script.

Por exemplo,

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

Quando ocorre um erro no passo 1, eu quero-o para registrar esse erro (ou executar outras funções personalizadas com ele), em seguida, retomar na etapa 2. Isso é possível? e como posso implementá-lo?

EDIT:? Posso fazer algo assim

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

myErrCatch:
'log error
Resume Next
Foi útil?

Solução

VBScript não tem noção de atirar ou capturar exceções, mas o tempo de execução fornece um objeto Err global que contém os resultados da última operação executada. Você tem que verificar explicitamente se a propriedade Err.Number é diferente de zero após cada operação.

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

O "On Error Goto [label]" sintaxe é suportado pelo Visual Basic e Visual Basic for Applications (VBA), mas VBScript não suporta este recurso de linguagem que você tem que usar On Error Resume seguida como descrito acima.

Outras dicas

Note que On Error Resume Next não está definido globalmente. Você pode colocar sua parte insegura de código de exemplo para uma função, que será interrompido imediatamente se ocorrer um erro, e chamar essa função de sub contendo declaração precedente 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

Eu sou excepcionalmente novo para VBScript, pelo que esta não pode ser considerada a melhor prática ou pode haver uma razão que não deve ser feito este que forma eu ainda não estou ciente de, mas esta é a solução que eu vim acima com a aparar para baixo a quantidade de código de log de erro no meu bloco 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

Você pode se reagrupar seus passos funções chamadas em uma função de fachada:

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

Então, deixe seu manipulação de erro estar em uma função superior que chama a 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

Agora, step3() supõem Vamos gerará um erro. Desde facade() não lidar com erros (há não On error resume next em facade()), o erro será devolvido ao main() e step4() e step5() não será executada.

Seu tratamento de erros está agora reformulado em 1 bloco de código

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top