Quero usar o VBScript para detectar erros e registrá-los (ou seja, em caso de erro "registrar algo") e, em seguida, retomar a próxima linha do script.
Por exemplo,
On Error Resume Next 'Faça o Passo 1 'Faça o Passo 2 'Faça o Passo 3
Quando ocorre um erro na etapa 1, quero que ele registre esse erro (ou execute outras funções personalizadas com ele) e continue na etapa 2. Isso é possível? e como posso implementá-lo?
EDIT: Posso fazer algo assim?
Em caso de erro, Resume myErrCatch 'Faça o passo 1 'Faça o passo 2 'Faça o passo 3 myErrCatch: 'log de erro Retomar a seguir
vbscript
error-handling
apandit
fonte
fonte
Respostas:
O VBScript não tem noção de lançar 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ê deve 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
A sintaxe "On Error Goto [rótulo]" é suportada pelo Visual Basic e Visual Basic for Applications (VBA), mas o VBScript não oferece suporte a esse recurso de linguagem, portanto, você deve usar On Error Resume Next conforme descrito acima.
fonte
err.clear
precisa ser usado após cada verificação do objeto, para evitar erros anteriores que acionem a próxima verificação (por exemplo, technet.microsoft.com/en-us/library/ee692852.aspx ), em minha experiênciaerr
está desmarcada " por si só "à medida que o script avança. Sem testar mais, meu palpite é que utiliza limpezas de objetoserr
como um subproduto de suas operações internas.Err.Clear
.Observe que
On Error Resume Next
não é definido globalmente. Você pode colocar sua parte insegura do código, por exemplo, em uma função, que será interrompida imediatamente se ocorrer um erro, e chamar essa função a partir de sub contendo aOERN
instrução precedente .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
fonte
Você pode reagrupar suas chamadas de funções de etapas em uma função de fachada:
sub facade() call step1() call step2() call step3() call step4() call step5() end sub
Então, deixe seu tratamento de erros 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, vamos supor que
step3()
gere um erro. Desdefacade()
não manipula erros (há nenhumOn error resume next
emfacade()
), o erro será devolvido paramain()
estep4()
estep5()
não será executado.Seu tratamento de erros agora é refatorado em 1 bloco de código
fonte
Sou excepcionalmente novo em VBScript, então isso pode não ser considerado a prática recomendada ou pode haver um motivo para não ser feito dessa forma que eu ainda não conheço, mas esta é a solução que eu encontrei para 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
fonte