Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Trap degli errori

Ciao a tutti.
Ho quasi terminato il primo programma della mia suite.
Il problema ora sono gli utenti. Andra' in mano a degli incapaci
totali --siamo a livello di non saper disegnare una tabella con word
oppure di cambiare i margini delle pagine...-- e quindi devo gestire
*tutte* le possibili situazioni di non funzionamento del programma in
modo il piu' automatico possibile e di rendere praticamente nulla la
quantita' di cose che l'utente dovra' fare qualora ci sia un problema.
Dunque bisogna che gestisca gli errori praticamente ovunque e che
faccia in modo che il mio programma sia il piu' chiaro possibile nel
dire all'utente cosa mi dovra' riferirmi quando mi chiama per dire
cosa c'e' che non va.
Ho pensato di mettere un On Error in tutte le funzioni --di sub non ne
uso praticamente piu', cosi' ho sempre codici di ritorno che posso
controllare per vedere da programma che e' successo e se e' tutto ok--
e di usare un goto ERRORE, ma mi scontro con qualche problema.
Prima di tutto, e' una bella rottura, perche' in ogni funzione --e
sono tante--, scrivere un On Error e poi gestirlo richiede *tanto*
tempo. Seconda cosa, e' una bella rottura 2 volte, perche' tutte le
volte che chiamo una funzione potenzialmente pericolosa --cioe' quasi
tutte visto che lavoro con database-- devo poi controllare il valore
di ritorno.
Prima domanda: non c'e' un modo piu' furbo ed intelligente del mio per
controllare gli errori di praticamente tutte le funzioni?
Il problema a questo punto e' che, in questo modo, tutti i santi
aiutano nel visualizzare un messaggio di errore --il che gia' mi
aiuta--, ma piu' in la' di li' non so come fare. Apro una MsgBox in
cui indico il nome della sub o function che ha generato l'errore,
indico err.number e err.description e questo, per me, puo' essere
significativo in molti casi. Pero' poi manca il resto.
Mi spiego. Quando chiamo la mia funzione che estrae un recordset ci
possono essere 2 milioni di errori diversi: database chiuso,
istruzione sql sbagliata, non corrispondenza dei tipi di dato estratto
con i campi indicati nella query e chissa' quanti altri che nemmeno
immagino. In corrispondenza di questi diversi errori devo comportarmi
in modo diverso: se apro un recordset e poi mi blocco sul ciclo che ne
fa uso, non posso semplicemente uscire dalla funzione perche' devo
prima chiudere il recordset. Se, invece, mi blocco sull'apertura, il
recordset neanche l'ho aperto e quindi non lo posso/devo chiudere.
Da cio', la seconda domanda: tutti questi errori dove sono elencati?
Cioe', se volessi sapere l'elenco di tutti gli err.number dove lo
trovo in MSDN? Ho trovato Trappable Errors di VBA, ma ce ne sono
pochini e sono solo quelli runtime di VBA. Poi ho trovato alcuni
errori trappable dei common controls e cosi' via. Pero', ad esempio, i
tanti che ho da ADODB.* non ci sono...
Resto incapace di trovare *mai* *niente* in MSDN e resto, per ora,
della mia idea che come supporto sia veramente compassionevole.
Spero sappiate aiutarmi anche questa volta.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-VI --- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD
   On contrary of popular belief, Unix *IS* user friendly:
    it just appears to be selective who it is friend with

 Ciao a tutti.
[mega cut]
l'unico consiglio che posso darti č quello di fare un minimo il punto della
situazione sulla struttura del tuo programma, cercando di individuare i
punti piů critici della struttura;
quando aggiungi del codice per gestire un errore ragiona sempre come se
l'errore fosse un qualcosa di improbabile, ma comunque gestibile (in altre
parole, non aggiungere tonnellate di codice o modifiche sostanziali al
programma per gestire un errore che, nella peggiore delle ipotesi, scatta si
e no una volta al mese);
la gestione dell'errore deve essere finalizzata o a rimuovere la causa
dell'errore e quindi recuperare il flusso regolare del programma (es. disco
non presente) o a interrompree il tutto badando a non lasciare il sistema (e
i dati) in una situazione inconsistente o instabile; quando qualcosa va in
tilt, se la situazione non č risolvibile, ferma tutto e limita i danni prima
di farne magari di piů grossi;
nella stragrande maggioranza dei casi non č neanche necessario rendere il
tuo codice cosě intelligente da reagire in maniera opportuna ad ogni
tipologia di errore che si presenti; al max potrai gestire due o tre diversi
tipi di errore specifici;
in generale puoi ragionare sulla logica di successo o meno (va o no va) di
una singola operazione (apertura recordset, lettura dati, ecc.) e limitarti
a generare un opportuno file di log indicante tutti gli ulteriori dettagli
sull'eccezione intercorsa;
come ultima cosa un buon debug (della serie: proviamo a mandare in tilt il
mio programma... fatti aiutare magari da un tuo amico, ... anzi no, da qlc
che ti odia ;))) aiuta sicuramente a verificare la robustezza del tutto;
ciao

ho cercato anche io soluzioni del tipo ...METTO UN ON "GLOBAL" ERROR GOTO
ERROREGLOBALE e sotto al tag una procedura di messaggistica e invio dati
alla mia mail...ma niente da fare....
molti errori riferiti all'accesso ai dati (ADO) li risolvo utilizzando una
griglia fantastica (ma a pagamento) tal Janus GridEX che trappa l'errore
restituendo un msgbox.
consiglio di nominare un bel gruppo di beta tester....:-)))))
ciao

 recordset neanche l'ho aperto e quindi non lo posso/devo chiudere.
Dunque, io in genere faccio cosě, e di solito funziona.
Function MyFunc()
    MyFunc = False ' o 0, a seconda
    [codice che sicuramente non mi da errori]
    On Error Goto ExceptionSezione1:
        [codice che potrebbe generare eccezioni ti tipo Sezione1]
    On Error Goto 0
    On Error Goto ExceptionSezione2:
        [codice che potrebbe generare eccezioni ti tipo Sezione2]
    On Error Goto
    ...
    [codice di pulizia]
    MyFunc = True ' o <> 0, come sopra
    Exit Function
ExceptionSezione1:
    [codice di gestione eccezione di tipo Sezione1]
    [codice per la sistemazione delle condizioni iniziali]
    Exit Function
ExceptionSezione2:
    [codice di gestione eccezione di tipo Sezione2]
    [codice per la sistemazione delle condizioni iniziali]
    Exit Function
End Function
Se tutte le tue funzioni hanno questa struttura, e quando le richiami
controlli cosě:
    If (MyFunc) then
        [vado avanti]
    End if
Allora la gestione degli errori non diventa tanto complessa.
Avere l'elenco degli errori č mera illusione, poichč a parte gli errori base
di VB tutti gli altri dipendono dai server ole e spesso non sono correlabili
inequivocabilmente il numero e la descrizione.
Ciao

 [...]

>Allora (come sempre _prima_, potete sempre rifiutarvi di leggere !),
sono nato in una localita' di mare.
non mi viene il mal di mare giusto perche'
A leggere le risposte sopra le domande
post ordinando le righe a rovescio ?
Potremmo pero' decidere di rispondere ai tuoi
ciao, hal ;-)

che lo stesso errore avesse numero diverso tra Access e Oracle).
Sono fiero... Beh, almeno so che quel che non ho trovato e' ben
nascosto...
Saluti.


 ha scritto nel messaggio
news:kvt6ktsf7c3gpsepl...@4ax.com...
[cut]

non ho provato, ma che succede se scrivi nel TextBox a oppure bc oppure
4r ?
magari il "Tipo non corrispondente" te lo da quando usi il Val()
Ciao
Faber

 ha scritto nel messaggio
news:9i01tb$gaj97$1...@ID-56381.news.dfncis.de...


 considerazione puramente pratica.
ecco, allora fai una ricerca su 
groups.google.com
, e dimmi se capisci di
piů nei post in cui la risposta č sotto o in cui la risposta č sopra o
in cui il testo quotato non c'č proprio  :\
Faber

 solo motivo valido per rispondere sotto.
Perche' se quoti sotto e' inutile che quoti.
Perche' se leggo i post abbastanza frequentemente non so a chi
risponda un msg e per saperlo devo scorrerlo fino all'inizio del
quoting.
Perche' se leggo una risposta ad un post un po' vecchio posso non
ricordarmi perfettamente di cosa si parlava e per saperlo devo
andare a leggere in fondo.
Perche' non bisognerebbe quotare tutto il messaggio al quale si
risponde (si spreca solo banda e non serve a nulla), ma quotare le
parti significative. Se queste le metto sotto e' inutile che le
metta.
Perche' quotare sotto e' come scrivere le risposte prima delle
domande.
Mi pare che di motivi ce ne siano molti e validi.
Ciao.

considerazione puramente pratica.
Neanche la mia, altrimenti non avrei scritto il post che ho scritto, 
beninteso :)
Continuo a pensarla (sempre da un punto di vista pratico) come
gia' hanno detto Faber e H.P.L.. 
Vorra' dire che mi rassegnero' a consumare le vertical scroll bar
del newsreader :-(
ciao, hal
p.s.
Lo sai che quando ho letto l' esempio di codice del Merqurio ho
avuto un soprassalto ?
Nella mia (breve) carriera di programmatore c'e' stato anche un 
programma di gestione farmacie che, fra l' altro, interagiva col
Merqurio per dos.

 Mi pare che di motivi ce ne siano molti e validi.
Anche a me :))
Ciao
Alfonso
P.s.
Senza essere indiscreto, mi potresti almeno dire il tuo nome di battesimo ?
E' brutto parlare con una persona di cui non si sa neanche il nome...

 Merqurio per dos.
Ma che dici !!?? Merqurio l'ho praticamente scritto tutto io (almeno
all'inizio, poi avevo dei programmatori), e fino a due anni fa ero il
direttore tecnico della Qwerty!!
Come si chiama il gestionale ? quanti ricordi...
ciao
Alfonso

 maggiore diritto di utilizzarlo comodamente.
beh, sono di più i messaggi che hai nel tuo News Reader o quelli in cui
puoi fare una ricerca su Google?  :)
tra l'altro anche OE, quando mostra il risultato di una ricerca in un
NG, fa vedere il messaggio 'da solo', non 'nel thread'
Ciao
Faber

 
Tra l'altro quasi tutti i newsreader hanno la possibilita'
(secondo me usata da molti), di visualizzare solo i messaggi
non ancora letti.
Quindi i vecchi messaggi dello stesso thread non sono immediatamente
visibili, ed aver un piccolo riassunto delle puntate precedenti
puo' essere molto utile.
Specie per chi, come me, gia' non si ricorda piu' di cosa parlava
il messaggio letto 5 minuti fa (messaggio a cui ho anche risposto).
-- 
Samuele Battarra
mail server: 
libero.it
, account: battarsa
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/leggiminews.html

Ho quasi terminato il primo programma della mia suite.
[...]

Nelle applicazioni con accesso a database, di solito uso una classe che accede al database e da
qualunque parte dell'applicazione (salvo piccole eccezioni) devo utilizzare oggetti appartenenti a
tale classe per qualsiasi operazione sul db. Ne consegue che la gestione degli errori è limitata a
quella classe (diciamo classe/i per generalizzare, poiché non è detto che ne basti una, dipende da
com'è strutturata l'applicazione). Ogni procedure di tale classe che accede al db, inizia con un bel
"On error goto ..." e nella routine di gestione degli errori, genero un errore (che quindi verrà
gestito dalla routine esterna che ha invocato quel metodo/proprietà della classe (*)) del tipo:
err.raise codicedierrore, "NomeClasse::NomeRoutine", "Descrizione dell'errore"
il codice di errore lo definisco io (vbobjecterror+512+qualcosa), ma è solo per figura poiché una
volta che so la routine nel quale viene generato e la descrizione, ho tutte le info necessarie.
Molte volte, nel caso di errori standard di vb, mantengo la descrizione standard: in pratica
(scritto di pugno):
Public Sub MioMetodo  'appartenente alla classe clsClasse
	On error goto ErrHandler
	'[...]
	Exit Sub
ErrHandler:
	dim descrizione as string
	Select case Err.Number
		Case vbErroreCheNeSo 'definito ad esempio vbObjectError + 512 + 1
			descrizione="Mah, non so che sia successo"
		Case vbErroreCheNeSo2 'definito ad esempio vbObjectError + 512 + 2
			descrizione="boh..."
		case else
			descrizione=err.description
	end select
	err.raise err.number, "ClsClasse::MioMetodo", descrizione
end sub
Il problema, però, continua a persistere nel caso in cui tu debba compiere alcune azioni in
relazione al codice di errore generato. In questo caso, i "Case" diventano molti, ti devi giocare
con i vari Resume/Resume Next e ritorni al punto di partenza. C'è però da fare una considerazione:
E' sempre necessario "correggere gli errori al volo"? Ovvero, se il messaggio di errore è relativo
all'impossibilità di scrivere sul recordset, potrebbe essere che il record è bloccato e quindi
evidentemente non puoi dire alla routine di aspettare che si sblocchi, ma è meglio notificarlo
all'utente e lasciare che riprovi dopo qualche sec; Inoltre, non è forse meglio (se possibile)
prevenire l'errore? Infatti se l'errore si riferisse al fatto che il recordset è già aperto, anziché
gestirlo, non sarebbe più semplice prevenirlo con un "If rs.State=vbclosed then rs.open"? (non
ricordo se la costante è corretta, ma ci siamo capiti). Certo questo richiede una maggior attenzione
nel immaginare quali potrebbero essere i possibili errori, però almeno limiti la gestione di quelli
che vengono generati, che in pratica restano solo queli da notificare all'utente.
(*)
Nella routine chiamante invece, c'è un altra routine di gestione degli errori che però, alla luce di
quanto appena affermato, non fa altro che visualizzare il codice, l'origine ed il messaggio
d'errore...
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.msvbsite.net
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.it-lang-vb.net
---------------------------------------------------------------------------

 (messaggio a cui ho anche risposto).
E, tanto per restare in argomento, anche il non indicare il nome
della persona alla quale si risponde, secondo me crea problemi nella
comprensione del thread.
Ciao.

 il tuo nome di battesimo ?
Mi chiamo Sergio.
Ciao.

impossibile.
  Basterebbe usare un newsreader un po' piu' serio di autlucche,
ovvero qualsiasi altro. :->
  Fa conto che con Free Agent ero arrivato ad avere su un paio di
newsgroup una message base di oltre 100 MByte per ognuno dei newsgroup
(non ho idea di quante migliaia di messaggi ci fossero) e sul mio
vecchio P133 gli facevano una gran pippa mentre autlucche riesce a
mettere in ginocchio anche il mio nuovo Athlon 1.2 GHz. Oltretutto,
eviti tutti i problemi di sicurezza e non usi il "R:" fuori standard
di autlucche.
  Ciao :-)
  Massimo
  Nell'indirizzo, inserire una "h" tra la "t" e la "u"
  In the address, insert an "h" between the "t" and the "u"

 e non usi il "R:" fuori standard di autlucche.
Problemi di sicurezza non ne ho, basta un po' di accortezza nelle
impostazioni del sistema operativo; in quanto al problema della R al
posto di Re non e' un problema di OE ma di una specifica versione
(italiana) di OE (la 5, 5 e qualcosa - ora non mi ricordo) ed e'
stato ormai risolto da tempo. Basta utilizzare una versione piu'
recente.
In quanto ad altri newsreader (tra cui Agent), ne ho provato
qualcuno ed sono rimasti sul mio HD per non piu' di 2-3 minuti
ciascuno. OE avra' un sacco di problemi, non lo nego certamente, gli
mancheranno anche caratteristiche utili (anche se non lo sono per
me), ma come interfaccia l'ho trovato sicuramente il migliore. Poi,
come sempre, ognuno ha i suoi gusti.
Ciao.

A meno che tu non abbia uno schermo da un centinaio di pollici.
  Ho "solo" un 19". :-)


AM = Alfonso Moscato, H = hal1961
H >> Lo sai che quando ho letto l' esempio di codice del Merqurio ho
H >> avuto un soprassalto ?
H >> Nella mia (breve) carriera di programmatore c'e' stato anche un
AM >Adesso invece che fai ?
Breve nel senso che non e' cominciata tanto tempo fa ;-)
H >> programma di gestione farmacie che, fra l' altro, interagiva col
H >> Merqurio per dos.
AM >Ma che dici !!?? Merqurio l'ho praticamente scritto tutto io (almeno
AM >all'inizio, poi avevo dei programmatori), e fino a due anni fa ero il
AM >direttore tecnico della Qwerty!!
Allora e' proprio il Merqurio che dico io :-)
AM >Come si chiama il gestionale ? quanti ricordi...
Se mi mandi un indirizzo email valido, ti rispondo a parte ;-)
ciao, hal
p.s.
solo le montagne non si incontrano mai ...
(e il pangea ?)

 l'interfaccia del client, e' questione di gusti.
Continuo a non capire. Tu hai la schermata che ti propone
100-150.000 intestazioni (anche se ovviamente devi scorrere per
poterle visualizzare tutte)?
Hai idea di cosa significhi scorrere una simile vista?
A me, gia' con un migliaio di messaggi, appare assolutamente fuori
dal mondo, e credo sia cosi' per quasi tutti gli esseri umani.
Ciao.

dal mondo, e credo sia cosi' per quasi tutti gli esseri umani.
  Aaaaaaaaaaaaaah, ecco spiegato l'arcano: io NON sono un essere
umano! :-)))


 NON sono un essere umano! :-)))
C'e' sempre una spiegazione a tutto ;-)
Ciao.

questa vista completa...
  Quando mai ho affermato che non la utilizzo? Se voglio scorrere i
vecchi messaggi di un certo thread ho bisogno di avere tutti i titoli
caricati, se sto cercando un thread recente di cui non ricordo
esattamente il titolo mi e' comodo avere la lista completa e cosi'
via.



mosca...@tin.it
 è valido, è solo che avevo il contrratto bloccato perchè
non avevo pagato :))
Adesso comunque l'ho riattivato.
Ciao
Alfonso

 Mi chiamo Sergio.
Evviva! E H.P.L. per cosa sta (sono inguaribilmente curioso...)?
Ciao
alfonso

 inguaribilmente curioso...)?
Consultare il Necronomicon per la risposta ;-))
Ciao.

Consultare il Necronomicon per la risposta ;-))
Howard Phillips Lovecraft
nientemeno !
ciao, hla 

4r ?
Non e' possibile che ci sia altro al di fuori di cifre perche' nel
keypress ho gia' filtrato tutto quanto. Comunque il problema avviene
sempre e solo quando le cifre sono 4... A questo punto, mi viene il
dubbio che sia davvero la val in quel caso, pero' non ha niente di
diverso dalle altre. Se ci scrivi 1970, si pianta...


considerazione puramente pratica.
s/\./\,/g
in aperto contrasto con la posizione di *tutti* quelli che dovrebbero
beneficiare dalla tua posizione.
Il mio subject si capisce? Non credo... Eppure ho messo dei tag che a
me sono comodi per fare ricerche e se tutti usassero i miei, tutti
andrebbero meglio, perche' potrebbero fare ricerche in un attimo. Poi
anziche' il ?, che ha un significato particolare in perl o altri
linguaggi, io uso il ^, che non mi da' problemi quando faccio ricerche
con regexp in Linux. Poi le quadre si fanno a fatica, con l'Alt-Gr:
molto meglio le tonde, che ho piu' a portata di mano perche' premo lo
<shift> con la mano sinistra. Poi il subject a me piace in ROT13 per
una serie di motivi: perche' non dovrei usarla? Siete voi che dovreste
uniformarvi a me, perche' sono piu' furbo :)


maggiore diritto di utilizzarlo comodamente.
Appunto: leggendo solo i messaggi che gli pare.


 uniformarvi a me, perche' sono piu' furbo :)
I miei post si capiscono, e spesso sono anche stato ringraziato per l'aiuto
che dò.
Il tuo subject no.
Ciao
Alfonso

 diverso dalle altre. Se ci scrivi 1970, si pianta...
beh, se i controlli li fai nel KeyPress() allora posso incollare ciň che
voglio, nel TextBox  ;)
ti converrebbe fare un controllino anche nel Change()
Faber


più che altro spostare tutto dalla LostFocus alla Validate...
ciao
ugo

Re by mail :)
Direi che qua siamo andati avanti abbastanza :)
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro RomagnoloŽ, diffidate dalle imitazioni!


ti converrebbe fare un controllino anche nel Change()
Giusto. Daro' un'occhiata anche al Change. La mia classe BTBText si
amplia con un'altra feature =)
Saluti.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro RomagnoloŽ, diffidate dalle imitazioni!


più che altro spostare tutto dalla LostFocus alla Validate...
Non ho un'idea neanche vaga del motivo :) comunque daro' un'occhiata.
Grazie.


 Grazie.
Per una questione di ordinamento degli eventi:
Validate viene richiamata -prima- della lostfocus.
Non so nel tuo caso,  (bisognerebbe capire "cosa" realmente č di "tipo non
corrispondente", e francamente non credo sia l'integer), ma in ogni caso la
validate ti permette di verificare i dati finchč sei -ancora- nel controllo
da testare.
Spesso č diverso...
ciao
ugo

Validate viene richiamata -prima- della lostfocus.
Ho capito, grazie. Lo tengo in considerazione. Puo' essermi comodo, in
effetti, controllare finche' sono ancora nel controllo.
Ho inserito ancora qualche informazione nella dialog di errore e sto
aspettando il feedback del mio utente attuale. Sperem che mi chiami
presto.
