VBScript — 오류 처리 사용


84

VBScript를 사용하여 오류를 포착하고 기록 (즉, "log something"오류 발생시) 한 다음 스크립트의 다음 줄을 다시 시작하고 싶습니다.

예를 들면

오류시 다음 재개
'1 단계 수행
'2 단계 수행
'3 단계 수행

1 단계에서 오류가 발생하면 해당 오류를 기록하거나 다른 사용자 지정 기능을 수행 한 다음 2 단계에서 다시 시작합니다. 이것이 가능합니까? 어떻게 구현할 수 있습니까?

편집 : 이런 식으로 할 수 있습니까?

오류시 myErrCatch 재개
'1 단계 수행
'2 단계 수행
'3 단계 수행

myErrCatch :
'로그 오류
다음 재개

1
Dylan의 응답은 VB가 오류 처리 부서에서받는 것만 큼 좋습니다. 이것이 내가 빠져 나갈 수있을 때 항상 Javascript를 사용한 이유입니다.
wcm

답변:


161

VBScript는 예외를 던지거나 잡는 개념이 없지만 런타임은 마지막으로 수행 된 작업의 결과를 포함하는 전역 Err 개체를 제공합니다. 각 작업 후에 Err.Number 속성이 0이 아닌지 명시 적으로 확인해야합니다.

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

"On Error Goto [label]"구문은 Visual Basic 및 VBA (Visual Basic for Applications)에서 지원되지만 VBScript는이 언어 기능을 지원하지 않으므로 위에서 설명한대로 On Error Resume Next를 사용해야합니다.


3
당신은 등 차례 출구 응용 프로그램에서 오류를 기록 할 수있는 기능 또는 하위, 호출 할 경우, 문 내에서 WScript.Echo을 변경할 수 있습니다
StormPooper

"마지막으로 수행 된 작업의 재사용을 포함합니다". 사실인가요? 큰 차이 인 마지막 오류가 발생하는 것 같습니다.
Damien Golding

err.clear다음 검사 (예 : technet.microsoft.com/en-us/library/ee692852.aspx )에서 이전 오류가 발생하지 않도록 개체를 검사 할 때마다 사용해야 한다는 MS의 문서에도 불구하고 내 경험상 err" 스크립트가 진행됨에 따라 " 더 이상 테스트하지 않고 내 추측은 err내부 작업의 부산물로 개체 지우기 를 사용하는 것입니다.
user66001 2014-12-02

@ user66001 동의했지만 명시 적으로 호출하는 것이 더 안전합니다 Err.Clear.
Lankymart

12

참고 On Error Resume Next세계적으로 설정되어 있지 않습니다. 예를 들어 코드의 안전하지 않은 부분을 오류가 발생하면 즉시 중단되는 함수에 넣을 수 있으며, 선례가 포함 된 sub에서이 함수를 호출 할 수 있습니다 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

1
내가 본 것 중 가장 명확한 예는 아니지만 개념을 얻었습니다.
Lankymart

7
@Lankymart 당신은 그때 본 더 명확한 예를 연결해 주시겠습니까, 아니면 대신 omegastripes가이 예를 어떻게 개선 할 수 있는지 제안 하시겠습니까?
Dominick

3
두 번째, 나는 내가 롤 "omegastripes"라는 새로운 소프트웨어 엔지니어링 패러다임을 놓친 느낌 있어요
TheBlastOne

4

파사드 함수에서 단계 함수 호출을 다시 그룹화 할 수 있습니다.

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

그런 다음, 파사드를 호출하는 상위 함수에 오류 처리가 있도록합니다.

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

이제 step3()오류가 발생 한다고 가정 해 보겠습니다 . 때문에 facade()오류를 (없다 처리하지 않습니다 어떤 On error resume next 에서 facade()) 오류가 반환됩니다 main()step4()step5() 실행되지 않습니다.

이제 오류 처리가 1 개의 코드 블록으로 리팩토링됩니다.


1

나는 예외적으로 VBScript를 처음 사용하므로 모범 사례로 간주되지 않거나 아직 알지 못하는 방식으로 이렇게하지 말아야 할 이유가있을 수 있지만 이것이 내가 트리밍하기 위해 생각 해낸 솔루션입니다. 내 주 코드 블록의 오류 로깅 코드 양을 줄였습니다.

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

1
이것은 평범한 오래된 VBScript가 아닌 ASP Classic입니다
Jobbo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.