Pergunta

Eu tenho pedido VB6, eu quero colocar algumas boas manipulação de erro finction em que ela pode me dizer qual foi o erro e lugar exato quando isso aconteceu, alguém pode sugerir a boa maneira de fazer isso

Foi útil?

Solução

ON GOTO ERRO

e

Err

objeto.

Há um tutorial aqui .

Outras dicas

Em primeiro lugar, ir buscar MZTools para o Visual Basic 6 , sua livre e inestimável . Segundo adicionar um manipulador de erro personalizada em cada função (sim, cada função). O manipulador de erro usamos é algo como isto:

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}"

Em seguida, crie uma função LogError que registra o erro de disco. Em seguida, antes de liberar o código Números de linha add para cada função (isto também é construído em MZTools). A partir de agora você vai saber do erro Logs tudo o que acontece. Se possível, também, fazer o upload dos logs de erros e realmente examiná-los ao vivo a partir do campo.

Este é o melhor que você pode fazer para manipulação inesperada mundial de erro em VB6 (um de seus muitos defeitos), e realmente isso só deve ser usado para encontrar erros inesperados. Se você sabe que, se houver a possibilidade de um erro que ocorre em uma determinada situação, você deve pegar esse erro e alça especial para ele. Se você sabe que um erro que ocorre em uma determinada seção vai causar instabilidade (File IO, problemas de memória, etc) avisar o usuário e saber que você está em um "estado desconhecido" e que "coisas ruins" são provavelmente vai acontecer. Obviamente usar termos amigáveis ??para manter o usuário informado, mas não assustou.

uma maneira simples, sem módulos adicionais, úteis para módulos de classe:

antecipar-se cada função / subs:

On Error Goto Handler

manipulador / bubbleup:

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

voila, gueto rastreamento de pilha.

Eu uso um módulo Error.bas home-grown para fazer relatórios e re-raise menos pesado.

Aqui está o seu conteúdo (editado para comprimento):

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

Reportando um erro é tão simples como:

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

reraise um erro é tão simples como chamar Error.Reraise com a nova fonte.

Embora seja possível para recuperar os parâmetros Source e Procedure da pilha de chamadas se você compilar com simbólica informações de depuração, não é confiável o suficiente para uso em aplicações de produção

Sim, o conselho de Kris e obter MZTools.

Você pode adicionar números de linha para a seção off áreas de procedimentos complexos, que ERL deve informar o manipulador de erro, para rastrear qual área está causando o erro.

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

Use on

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

Use a instrução On erro eo objeto Err.

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