+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 4 su 4

Gestione Errori con LOG

  1. #1
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    In fase di Debug di applicativi serve avere dei riscontri dalle procedure in caso di ERRORE...

    Normalmente si implementano le gestioni ERRORI in modo molto accurato per evitare CRASH e situazioni non gestibili, ma spesso serve avere dei riscontri più spinti sia sull'errore ma anche sulla funzione/sub che lo hanno generato.

    Per questo la gestione ERRORI che a prescindere da questo deve essere fatta sempre, può essere potenziata per darci qualche dettaglio in più soprattutto se dobbiamo eseguire DEBUG su segnalazioni di cliente da remoto...

    Questo è un'esempio di come deve essere strutturata una normale gestione errori, alla quale ho aggiunto la chiamata alla generazione di LOG di dettaglio.

    Function NomeFunction_Sub(param1 As String, param2 As Long) As Boolean


    On Error GoTo AnySub_Err

    ' ----------------------
    ' CODICE GENERICO...
    ' ----------------------


    Exit_Here:

    Exit Function

    AnySub_Err:

    ' Serve memorizzare i valori dell'Oggetto ERROR in quanto uscendo dalla Routine di gestione viene distrutto.
    Dim lngErr As Long
    Dim strDesc As String

    lngErr = Err.Number
    strDesc = Err.Description

    Call ErrorLog(lngErr, strDesc, _
    "basError", _
    "NomeFunction_Sub", CStr(param1) & "," & CStr(param2))[/COLOR]

    Select Case lngErr

    ' Case is=3021
    ' fai qualche cosa...

    Case Else
    MsgBox lngErr & " - " & strDesc
    Resume Next
    End Select

    End Function


    Questo invece è il codice della gestione del LOG... che può essere migliorata e personalizzata in modo più spinto, quello che
    propongo è l'idea funzionale...!

    Option Compare Database
    Option Explicit

    Function ErrorLog(ByVal lngErrNumber As Long, _
    ByVal strErrDescription As String, _
    strModuleName As String, _
    strRoutineName As String, _
    strParametersList As String) As Boolean

    On Error GoTo Err_LOG

    Dim intFile As Integer
    Dim strPathFile As String
    Dim strMsgOut As String
    Dim strHeader As String
    Const cDelimiter As String = vbTab


    ErrorLog = False

    If FolderExists(CurrentProject.Path & "\ErrLog") = False Then MkDir CurrentProject.Path & "\ErrLog"

    strPathFile = CurrentProject.Path & "\ErrLog\Err_" & Format(Now(), "ddmmyyyy") & ".txt"
    intFile = FreeFile

    strMsgOut = Format(Now(), "dd/mm/yyyy hh:mm:ss")
    If Len(CurrentUser()) > 0 Then strMsgOut = strMsgOut & cDelimiter & CurrentUser()
    If Len(lngErrNumber & "") > 0 Then strMsgOut = strMsgOut & cDelimiter & lngErrNumber
    If Len(strErrDescription) > 0 Then strMsgOut = strMsgOut & cDelimiter & strErrDescription
    If Len(strModuleName) > 0 Then strMsgOut = strMsgOut & cDelimiter & strModuleName
    If Len(strRoutineName) > 0 Then strMsgOut = strMsgOut & cDelimiter & strRoutineName
    If Len(strParametersList) > 0 Then strMsgOut = strMsgOut & cDelimiter & strParametersList

    strHeader = vbNullString
    If FileExists(strPathFile) = False Then
    strHeader = "Data" & cDelimiter & "USER" & cDelimiter & "Err.Num" & cDelimiter & "Err.Description" & cDelimiter & "Modulo" & cDelimiter & "Routine" & cDelimiter & "Parameters"
    End If
    Open strPathFile For Append Shared As #intFile
    If Len(strHeader) > 0 Then Print #intFile, strHeader
    Print #intFile, strMsgOut
    Close #intFile
    ErrorLog = True
    Exit_Here:
    Exit Function

    Err_LOG:
    MsgBox "Errore non previsto. Impossibile accodare al LOG ERROR" & vbNewLine & " Visualizza CTRL+G"
    ' Questa parte funziona solo se non si usa il RUNTIME e se non si ha un MDE... come è evidente essendo in IDE
    Debug.Print Format(Now(), "dd/mm/yyyy hh:mm:ss") & cDelimiter & _
    CurrentUser() & cDelimiter & _
    lngErrNumber & cDelimiter & _
    strErrDescription & cDelimiter & _
    strModuleName & cDelimiter & _
    strRoutineName & cDelimiter & _
    strParametersList
    SendKeys "^G"
    Resume Exit_Here

    End Function

    Public Function FileExists(ByVal str As String) As Boolean
    On Error Resume Next
    FileExists = (GetAttr(str) And vbDirectory) = 0
    End Function

    Function FolderExists(strPath As String) As Boolean
    On Error Resume Next
    FolderExists = ((GetAttr(strPath) And vbDirectory) = vbDirectory)
    End Function
    Ultima modifica di @Alex; 31-08-2012 09:35 
    ℹ️ Leggi di più su @Alex ...

  2. #2
    L'avatar di liodevac
    liodevac non è in linea Scolaretto
    Buonasera, e come di consueto, non è una novità, complimenti per l'articolo.
    Io utilizzo una gestione degli errori (che scrive un log) nella quale, in conseguenza del fatto che:

    a) una applicazione viene utilizzata non solo da utenti diversi (e ne consegue l'utilità della informazione 'current user') ma anche da computer diversi con la possibilità che un soggetto possa sedersi a lavorare su pc diversi da un giorno all'altro;
    b) è pure possibilie che i pc diversi abbiano anche diverse versioni di SO oppure di Office,

    e allora ho inserito nella mia funzione la scrittura di ulteriori informazioni (anche probabilmente ridondanti, mi rendo conto) che riporto se possono essere utili a qualche utente.

    Questo è solo un estratto dell'intera funzione:

    Dim Environrif As String

    Environrif = Environ("HOMEPATH") & " - " & Environ("PROCESSOR_IDENTIFIER") & " - " & _
    Environ("SBSSERVER") & " - " & Environ("SystemRoot") & " - " & _
    Environ("USERDOMAIN") & " - " & Environ("USERNAME") & " - " & Environ("USERPROFILE")

    E poi aggiungo e chiedo: io posso aver bisogno di rilevare l'oggetto nel quale si è verificato l'errore e allora aggiungo ancora:

    Dim intCurrentType As Integer
    Dim objCurrent As Object

    Set objCurrent = CodeContextObject
    intCurrentType = Application.CurrentObjectType
    che ne pensate può essere utile?
    ℹ️ Leggi di più su liodevac ...

  3. #3
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Ciao,
    diciamo che esistono ancora altre varianti... supponi di aver realizzato una Gestione utenti personalizzata...!!??
    Dovresti introdurre i dati di LOGIN specifici... ecc..., quindi le tue osservazioni sono ovviamente corrette, e vanno come sempre a completare questi demo semplificati a seconda
    delle specifiche esigenze dello sviluppatore.

    Per l'ultima tua osservazione io la vedo in modo diverso, nel senso che il codice deve essere AUTONOMO... quel codice restituisce l'oggetto nel quale avviene la chiamata... ma hai provato a farlo da un Modulo BAS...? Funziona...?

    Io preferisco, come nel mio Articolo, inserire in ogni Procedura il luogo nella quale si trova [strModuleName]...

    Esiste poi un'altro aspetto critico, per chi come me, usa spesso e volentieri CLASSI in gestione ricorsiva in Collection.
    In questi casi l'oggetto che genera l'errore è sempre la CLASSE, ma quale istanza ha generato l'errore...?
    IN questi casi pertanto serve che il programmatore abbia le idee chiare di quali dati possono essere UTILI al Debug di errori...
    ℹ️ Leggi di più su @Alex ...

  4. #4
    L'avatar di liodevac
    liodevac non è in linea Scolaretto
    OK, grazie delle ulteriori specifiche.
    In effetti 'passare' alla Function ErrorLog il nome e cognome e codice fiscale (scherzo!) di chi chiama sembra soluzione adatta allo scopo.
    Giustamente la quantità delle informazioni per l'errore dipende dall'obiettivo di chi sviluppa.
    ℹ️ Leggi di più su liodevac ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Function gestione errori
    Da guidochiappetta nel forum Visual Basic 6
    Risposte: 1
    Ultimo Post: 20-03-2012, 14:15
  2. Gestione errori in VB6
    Da Skary nel forum Visual Basic 6
    Risposte: 5
    Ultimo Post: 27-02-2009, 23:47
  3. [Word e VBA] gestione errori
    Da Andrea_BM nel forum Microsoft Word
    Risposte: 2
    Ultimo Post: 20-01-2009, 12:18
  4. [VB6] gestione errori
    Da nikasp nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 17-06-2008, 17:29
  5. Gestione errori
    Da raf1971 nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 16-03-2007, 16:42