문제

나는 VB6 응용 프로그램을 가지고 있습니다. 오류가 무엇인지, 오류가 발생한 정확한 위치를 알려주는 좋은 오류 처리 기능을 여기에 넣고 싶습니다. 누구든지 이 작업을 수행하는 좋은 방법을 제안할 수 있습니까?

도움이 되었습니까?

해결책

오류 발생 시 이동

그리고

Err

물체.

튜토리얼이 있습니다 여기.

다른 팁

우선 가서 얻으세요. Visual Basic 6용 MZTools, 무료이며 매우 귀중합니다.두 번째로 모든 함수(예, 모든 함수)에 사용자 정의 오류 처리기를 추가합니다.우리가 사용하는 오류 처리기는 다음과 같습니다.

On Error GoTo {PROCEDURE_NAME}_Error

{PROCEDURE_BODY}

    On Error GoTo 0
    Exit {PROCEDURE_TYPE}

{PROCEDURE_NAME}_Error:

   LogError "Error " & Err.Number & " (" & Err.Description & ") in line " & Erl & _
            ", in procedure {PROCEDURE_NAME} of {MODULE_TYPE} {MODULE_NAME}"

그런 다음 오류를 디스크에 기록하는 LogError 함수를 만듭니다.다음으로, 코드를 릴리스하기 전에 모든 기능에 줄 번호를 추가하세요(이는 MZTools에도 내장되어 있습니다).이제부터 발생하는 모든 일은 오류 로그를 통해 알 수 있습니다.가능하다면 오류 로그를 업로드하고 실제로 현장에서 실시간으로 검사하십시오.

이는 VB6의 예상치 못한 전역 오류 처리(많은 결함 중 하나)에 대해 수행할 수 있는 최선의 방법이며 실제로는 예상치 못한 오류를 찾는 데에만 사용해야 합니다.특정 상황에서 오류가 발생할 가능성이 있다는 것을 알고 있다면 해당 오류를 포착하고 처리해야 합니다.특정 섹션에서 발생하는 오류로 인해 불안정성(파일 IO, 메모리 문제 등)이 발생할 수 있다는 것을 알고 있는 경우 사용자에게 경고하고 현재 "알 수 없는 상태"에 있으며 "나쁜 일"이 발생할 가능성이 있음을 알립니다.분명히 사용자에게 정보를 제공하기 위해 친근한 용어를 사용하되 두려워하지 마십시오.

추가 모듈 없이 간단한 방법으로 클래스 모듈에 유용합니다.

각 기능/하위 요소를 선점합니다.

On Error Goto Handler

핸들러/버블업:

Handler:
  Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description

짜잔, 게토 스택 추적.

나는 집에서 재배한 것을 사용한다. Error.bas 보고 및 재모집을 덜 번거롭게 만드는 모듈입니다.

내용은 다음과 같습니다(길이에 따라 편집됨).

Option Explicit

Public Sub ReportFrom(Source As Variant, Optional Procedure As String)
    If Err.Number Then
        'Backup Error Contents'
        Dim ErrNumber As Long: ErrNumber = Err.Number
        Dim ErrSource As String: ErrSource = Err.Source
        Dim ErrDescription As String: ErrDescription = Err.Description
        Dim ErrHelpFile As String: ErrHelpFile = Err.HelpFile
        Dim ErrHelpContext As Long: ErrHelpContext = Err.HelpContext
        Dim ErrLastDllError As Long: ErrLastDllError = Err.LastDllError
    On Error Resume Next
        'Retrieve Source Name'
        Dim SourceName As String
        If VarType(Source) = vbObject Then
            SourceName = TypeName(Source)
        Else
            SourceName = CStr(Source)
        End If
        If LenB(Procedure) Then
            SourceName = SourceName & "." & Procedure
        End If
        Err.Clear
        'Do your normal error reporting including logging, etc'
        MsgBox "Error " & CStr(ErrNumber) & vbLf & "Source: " & ErrSource & vbCrLf & "Procedure: " & SourceName & vbLf & "Description: " & ErrDescription & vbLf & "Last DLL Error: " & Hex$(ErrLastDllError)
        'Report failure in logging'
        If Err.Number Then
            MsgBox "Additionally, the error failed to be logged properly"
            Err.Clear
        End If
    End If
End Sub

Public Sub Reraise(Optional ByVal NewSource As String)
    If LenB(NewSource) Then
        NewSource = NewSource & " -> " & Err.Source
    Else
        NewSource = Err.Source
    End If
    Err.Raise Err.Number, NewSource, Err.Description, Err.HelpFile, Err.HelpContext
End Sub

오류를 보고하는 방법은 다음과 같이 간단합니다.

Public Sub Form_Load()
On Error Goto HError
    MsgBox 1/0
    Exit Sub
HError:
    Error.ReportFrom Me, "Form_Load"
End Sub

오류를 다시 발생시키는 것은 호출만큼 간단합니다. Error.Reraise 새로운 소스로.

검색이 가능하긴 하지만 Source 그리고 Procedure 기호 디버그 정보로 컴파일하는 경우 호출 스택의 매개변수는 프로덕션 애플리케이션에서 사용하기에 충분히 안정적이지 않습니다.

예, Kris의 조언을 듣고 MZTools를 받으세요.

ERL이 오류 처리기에서 보고하는 복잡한 프로시저 영역에 줄 번호를 추가하여 오류를 일으키는 영역을 추적할 수 있습니다.

10
    ...group of statements
20
    ...group of statements
30
    ...and so on

사용 대상

dim errhndl as string
on error goto errhndl
errhndl:
msgbox "Error"

On Error 문과 Err 개체를 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top