Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Gestione errori

Ho una funzione che chiamo dopo ogni errore gestito dalla On Error e
che dovrebbe mostrare all'utente informazioni chiare rispetto
all'errore che č stato innalzato:
Sub MsgOnError()
  Dim e As String, er As Long
  e = Error$
  er = Err
 
  On Error GoTo RErr
 
 
  Dim errObj As Error, s As String
  Dim i As Long
 
  If er <> 3146 Then    'ODBC Call failed
     MouseArrow
     If er = 53 Or er = 76 Then
        If Not gbInTXT Then
            MsgBox Translate("Il file associato al documento non e'
recuperabile.")  'ivlm
        End If
        Exit Sub
     End If
     MsgBox "Errore [" & str(Err.Number) & "] " & Err.Description & _
            Chr(13) & "generato da " & Err.Source
     Exit Sub
  End If
 
  If DBEngine.Errors.count = 0 Then
    Exit Sub
  End If
 
  s = ""
  For i = 0 To DBEngine.Errors.count - 1
    Set errObj = DBEngine.Errors(i)
    If errObj.Number <> 0 Then
       s = s & errObj.Number & ". " & errObj.Source & " " &
errObj.Description & Chr$(13)
    End If
  Next
  MouseArrow
  If s <> "" Then
     MsgBox s, 48
  End If
  Exit Sub
 
RErr:
  Exit Sub
  Resume Next
End Sub
Questa funzione in alcuni casi perň ha dei problemi perchč il
messaggio che viene visualizzato č il seguente:
"Errore [0] 
generato da "
che non vuol dire assolutamente nulla, come mai? Qualcuno utilizza
qualcosa di simile me che funziona sempre? Se fosse possibile anche
ricavare riga e modulo o procedura dove si č verificato l'errore
sarebbe meglio.
Grazie
Ciao
-- 
Fritz
Togli *ERASE* per rispondere in e-mail.


Per ricavare la riga dell'errore basta mettere qualcosa del genere:
    msgbox "Errore alla linea: " & erl
naturalmente dopo aver numerato le righe di codice. Una buona utility è 
MzTools.
Ciao, Vincenzo 

 sarebbe meglio.
Per il numero di riga ti hanno già risposto (ma anche Erl deve essere salvato
prima di On Error), per modulo e procedura non c'è modo AFAIK in VB6 (al
contrario di 
VB.NET
).
L'unica è dotare la tua sub MsgOnError di due appositi parametri ModuleName e
ProcedureName e di passarli esplicitamente nella chiamata, a seconda del
contesto.
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

   End If
forse sarebbe meglio:
    er = Err
    if er = 0 then exit sub
by
r

 sarebbe meglio.
Io mi sono fatto una classe che gestisce lo stack di chiamate che ha 
generato l'errore dando la possibilità di ritentare o annullare.
Il numero di riga lo puoi ottenere se numeri tutte le linee di codice (con 
gli MZTools lo puoi fare in automatico) e lo ottieni con Erl.
Il nome della procedura lo devi mettere tu a mano (sempre con gli MZTools 
puoi crearti un template per la gestione degli errori richiamabile con un 
click).
Sinceramente riscriverei la tua procedura in un modo più lineare senza exit 
sub e msgbox sparsi, in modo che sia anche più semplice seguire il flusso.
Ad. es:
If er = 3146 Then
    If DBEngine.Errors.count > 0 Then
        ' ... gestione degli errori ODBC
    End if
Else
    ' gestione degli errori normali
End id
MsgBox msg,...
Occhio che se usata in un form può andar bene, ma se usata in una funzione 
di un modulo o di una classe dovrebbe limitarsi a risollevare l'errore con 
una Err.Raise.
Inoltre tu sei consapevole che se il jet engine non è tra i riferimenti la 
tua non compila.
Ciao 

contesto.
Si ok, grazie


tua non compila.
Beh già compila l'applicazione quindi ci sono.
Grazie dei suggerimenti


 anche il come farlo manualmente.
Metti una label numerica all'inizio di ogni linea di codice, ad es.
100    For i = 1 To 10
110        Print #f, Chr$(i)
120    Next i


120    Next i
A, ok come si faceva con il vecchio Basic :-)
