sourcecode

디버깅 버튼이 있는 표준 에러 메시지와 같은 에러 메시지를 표시하는 방법

codebag 2023. 4. 23. 10:19
반응형

디버깅 버튼이 있는 표준 에러 메시지와 같은 에러 메시지를 표시하는 방법

에러 핸들러를 작성했습니다.On Error Goto몇 줄의 클리닝 코드를 입력하고 에러 메시지를 표시합니다만, 디폴트 핸들러의 편안함을 잃고 싶지 않습니다.디폴트 핸들러의 쾌적함도, 에러가 발생한 정확한 행으로 향합니다.내가 어떻게 그럴 수 있을까?

일단 좋은 소식입니다.이 코드는 사용자가 원하는 기능을 수행합니다('라인 번호'를 참조하십시오).

Sub a()
 10:    On Error GoTo ErrorHandler
 20:    DivisionByZero = 1 / 0
 30:    Exit Sub
 ErrorHandler:
 41: If Err.Number <> 0 Then
 42:    Msg = "Error # " & Str(Err.Number) & " was generated by " _
         & Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description
 43:    MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext
 44:    End If
 50:    Resume Next
 60: End Sub

실행 시 예상되는 MsgBox가 표시됩니다.

alt 텍스트

그리고 이제 나쁜 소식은:
행 번호는 이전 버전의 Basic의 나머지입니다.보통 프로그래밍 환경에서 삽입 및 업데이트를 담당했습니다.VBA 및 기타 "현대" 버전에서는 이 기능이 상실됩니다.

다만, 여기에서는, 행 번호를 자동적으로 추가하는 몇개의 대안이 있어, 타이핑하는 귀찮은 작업이 불필요합니다만, 모두 다소 귀찮은 것 같습니다.또는 상업용입니다.

HTH!

에러 핸들러의 에러 핸들러가 실행중의 에러 타입과 일치하지 않는 경우는, 에러 핸들러를 무효로 해 재개하는 간단한 방법이 있습니다.

다음 핸들러는 각 오류 유형을 다시 확인하고 일치하지 않을 경우 오류 재개를 일반 VBA ie GoTo 0으로 되돌리고 코드를 재개하면 일반 오류 블록이 나타납니다.

On Error GoTo ErrorHandler

x = 1/0

ErrorHandler:
if Err.Number = 13 then ' 13 is Type mismatch (only used as an example)

'error handling code for this

end if

If err.Number = 1004 then ' 1004 is Too Large (only used as an example)

'error handling code for this

end if

On Error GoTo 0
Resume

이 답변에서는 [Debug]버튼을 다루지 않습니다(다음 질문의 방법과 같은 작업을 수행하려면 폼을 디자인하고 해당 버튼을 사용해야 합니다).그러나 이 부분은 다루어집니다.

디폴트 핸들러의 편안함을 잃고 싶지 않습니다.이러한 핸들러는, 에러가 발생한 정확한 회선을 나타내고 있습니다.

우선, 실가동 코드로 하고 싶지 않다고 생각합니다.디버깅용 또는 개인적으로 사용하는 코드로 하고 싶은 것입니다.컴파일러 플래그를 사용하여 디버깅을 나타냅니다.프로그램의 트러블 슈팅을 실시하면 문제의 원인이 되고 있는 행을 쉽게 찾을 수 있습니다.

# Const IsDebug = True

Sub ProcA()
On Error Goto ErrorHandler
' Main code of proc

ExitHere:
    On Error Resume Next
    ' Close objects and stuff here
    Exit Sub

ErrorHandler:
    MsgBox Err.Number & ": " & Err.Description, , ThisWorkbook.Name & ": ProcA"
    #If IsDebug Then
        Stop            ' Used for troubleshooting - Then press F8 to step thru code 
        Resume          ' Resume will take you to the line that errored out
    #Else
        Resume ExitHere ' Exit procedure during normal running
    #End If
End Sub

주의: 예외:Resume에러 처리 루틴이 없는 서브 세션에서 에러가 발생했을 경우,Resume는, 에러가 발생하고 있는 서브 매니저를 호출한 이 프로시저의 회선으로 이동합니다.단, 다시 에러가 발생할 때까지 서브프로시저를 계속 진행할 수 있습니다.서브프로시저가 너무 길어서 지루할 수 없는 경우 서브프로시저에는 에러 처리 루틴이 있을 수 있습니다.

여기에는 여러 가지 방법이 있습니다.트러블 슈팅을 실시할 때, 어느 쪽이든 순서를 밟을 수 있는 소규모 프로그램의 경우는, MsgBox 의 스테이트먼트 바로 뒤에 다음의 행을 붙입니다.

    Resume ExitHere         ' Normally exits during production
    Resume                  ' Never will get here
Exit Sub

다음 문 포인터를 해당 행으로 끌거나 해당 행에서 커서로 눌러서 실행할 다음 행으로 설정하지 않는 한 Resume 문에는 도달하지 않습니다.

다음은 이러한 개념을 자세히 설명하는 기사입니다.VBA 에러 처리에 관한 5가지 힌트.마지막으로 VBA를 사용하고 있는데 칩 피어슨의 멋진 사이트를 아직 발견하지 못한 경우 VBA의 오류 처리에 대해 설명하는 페이지가 있습니다.

저는 VBA 어플리케이션의 오류를 확인하고 싶었기 때문에 아래 코드를 만들었습니다.

Function Database_FileRpt
'-------------------------
On Error GoTo CleanFail
'-------------------------
'
' Create_DailyReport_Action and code


CleanFail:

'*************************************

MsgBox "********************" _

& vbCrLf & "Err.Number: " & Err.Number _

& vbCrLf & "Err.Description: " & Err.Description _

& vbCrLf & "Err.Source: " & Err.Source _

& vbCrLf & "********************" _

& vbCrLf & "...Exiting VBA Function: Database_FileRpt" _

& vbCrLf & "...Excel VBA Program Reset." _

, , "VBA Error Exception Raised!"

*************************************

 ' Note that the next line will reset the error object to 0, the variables 
above are used to remember the values
' so that the same error can be re-raised

Err.Clear

' *************************************

Resume CleanExit

CleanExit:

'cleanup code , if any, goes here. runs regardless of error state.

Exit Function  ' SUB  or Function    

End Function  ' end of Database_FileRpt

' ------------------

언급URL : https://stackoverflow.com/questions/3911973/vba-how-to-display-an-error-message-just-like-the-standard-error-message-which

반응형